Базы данных

Временны́е данные

Время в SQL

Содержание

Типы данных

  • Время
    • date — дата
    • time — время внутри суток
    • datetime — дата + время внутри суток
    • timestamp(n) — внутреннее время, с точностью n знаков после секунды
  • Интервал времени
    • interval — промежуток времени между событиями

Часовые пояса

  • Стандарт
    • UTC
  • Факт
    • Локальное время
  • Интерпретация дат и времени зависит от часового пояса
    • Разные у разных клиентов
    • И летнего/зимнего времени
    • Дублирования и разрывы
  • Типы
    • with timezone

Операции

  • времявремя = интервал
  • время + интервал = время
  • времяинтервал = время
  • интервал * число = интервал
  • интервал / число = интервал

Литералы

  • Время
    • date 'yyyy-mm-dd'
      
    • time 'hh:mm:ss.zzz'
      
    • datetime 'yyyy-mm-dd hh:mm:ss.zzz'
      
    • cast (days.fraction as datetime)
      
    • current_date, current_time, current_timestamp(n)
      
  • Интервал
    • interval 'PyYmMdDThHmMsS'
      
    • cast(days.fraction as interval)
      

Что такое временны́е данные

Содержание

Временны́е данные

  • Временны́е (темпоральные) данные
    • Зависят от времени
  • Типы зависимости
    • Информация о транзакциях (изменениях)
    • Информация о правильности
    • Бивременные данные

Информация об изменениях

  • Статус поступающих
    Событие Дата Статус
    Записался в вуз 15.07 Абитуриент
    Принёс документы 28.07 Абитуриент с документами
    Приказ о зачислении 06.08 Поступивший
    Выдача документов 01.09 Первокурсник
    Распределительный тест 03.09 Студент группы

Информация о правильности

  • Высота Эвереста
    Событие Год Высота
    Геодезические измерения 1856 8840
    Топографические измерения 1950 8848
    Китайские измерения 1975 8848.13
    Измерение по GPS 1998 8850
    Повторные китайские измерения 2005 8844.43
    Непальские измерения 2019 > 8844
    Совместные измерения 2020 8848.86

Бивременны́е данные (1)

  • События жизни
    Событие Факт Документы
    Родился ребёнок Рождение
    Регистрация рождения Свидетельство о рождении
    Изготовление паспорта Паспорт
    Наступило XX лет Начало действия

Бивременны́е данные (2)

  • В декабре появились сведения, что начальник поднял зарплату с сентября
  • Последствия
    • Какая зарплата была в ноябре?
      • Работник: новая
      • Банк: старая
      • Бухгалтерия: новая (но надо доплатить)
    • Выплаты зарплаты в сентябре-ноябре?
      • Не изменились
    • Начисленная зарплата в сентябре-ноябре?
      • Увеличилась
    • Выплаты в декабре?
      • Доплата за сентябрь-ноябрь

Временны́е атрибуты

  • Значение зависит от времени
    • Хранение меток времени
  • Метка на запись
    • Простота запросов
    • Компактность
    • Проблема с отслеживанием изменений
  • Метка на атрибут
    • Более сложные запросы
    • Бо́льшая гибкость
    • Отсутствие дублирования

Операции

  • Внесение изменений
  • Обычные запросы
    • На заданный момент времени
  • Запросы изменений
    • Как менялись атрибуты в указанный период времени
  • Статистические запросы
    • С усреднением по времени

Согласованность временны́х данных

  • Для любого момента времени
    • Известно значение
    • Ровно одно значение
  • Должна поддерживаться

Полувременны́е базы данных

Содержание

Полувременны́е базы данных

  • Текущие данные
  • Хранимые данные
    • Текущее значение
    • Отметка времени, с которой данные действительны
  • Представление данных
    • Каждому атрибуту — по метке времени!

Пример

  • Статус поступающих
    • create table entrants (
          Id int not null primary key,
          FirstName varchar(100) not null,
          LastName varchar(100) not null,
          Status varchar(100),
          StatusTimestamp timestamp
      )
      
  • Почему метка времени только для status?
    • Остальные данные не зависят от времени

Операции

  • Внесение изменений
    • Изменение данных и меток времени
  • Обычные запросы
    • С какого момента действителен результат?
      • Максимум по временным меткам
  • Запросы изменений
    • Не поддерживаются
  • Статистические запросы
    • Не поддерживаются

Временна́я реляционная алгебра

  • Распакованное представление
    • Состояние на каждый момент времени
    • Не практично
    • Требуется другое представление
  • Все операции исполняются так, как если бы они исполнялись на распакованных данных
    • Соединения
    • Статистика
  • Отслеживание изменений

Представление данных

  • Вместе с атрибутом хранится интервал действительности
    • Полуоткрытый
    • Возможны противоречия в данных

Пример

  • Информация о студенте
    • create table Students (
          StudentId int not null primary key,
          FirstName varchar(100) not null,
          LastName varchar(100) not null,
      )
      create table StudentGroups (
          StudentId int not null references students(id),
          GroupId int not null references groups(id),
          bg date not null,
          nd date not null
      )
      

Вопросы

  • Почему две таблицы?
    • Чтобы избежать дублирования
    • По таблице на каждый темпоральный атрибут
  • Что является ключом StudentGroups?
    • (StudentId, GroupId, bg)
    • (StudentId, GroupId, nd)
  • Как хранить данные, верные до текущего момента времени?
    • Полувременная база данных
    • Отметка ≪бесконечность≫ (inf = date '9999-12-31')

Ограничения целостности

  • Интервалы не пересекаются
    • check (not exists (
          select * from
              StudentGroups s1 inner join
              StudentGroups s2 on s1.StudentId = s2.StudentId
          where
              greatest(s1.bg, s2.bg) < least(s1.nd, s2.nd)
      ))
      
  • Что делать для нескольких временны́х атрибутах?
    • Отдельные ограничения

Пример соединения

  • Студенты, учащиеся в одной группе
    • Не SQL:
      StudentGroups g1 inner join StudentGroups g2
      on g1.GroupId = g2.GroupId
      using g1 (bg, nd) and g2 (bg, nd)
      
    • SQL:
      select 
          g1.*, g2.*, 
          greatest(g1.bg, g2.bg) as bg,
               least(g1.nd, g2.nd) as nd
      from StudentGroups g1 inner join StudentGroups g2
      on g1.GroupId = g2.GroupId
          and greatest(g1.bg, g2.bg) < least(g1.nd, g2.nd)
      

Соединения

  • Общий случай
    • Не SQL:
      t1 inner join t2 on condition
      using t1 (t1.bg, t1.nd) and t2 (t2.bg, t2.nd)
      
    • SQL:
      select t1.*, t2.*, 
          greatest(t1.bg, t2.bg) as bg,
               least(t1.nd, t2.nd) as nd
      from t1 inner join t2
      on condition
          and greatest(t1.bg, t2.bg) < least(t1.nd, t2.nd)
      

Операции над множествами

  • Пересечение?
    • Естественное соединение
  • Объединение?
    • select t1.*, greatest(t1.bg, t2.bg) as bg,
              least(t1.nd, t2.nd) as nd
          from t1 inner join t2
          on greatest(t1.bg, t2.bg) < least(t1.nd, t2.nd)
      union all 
      select t2.*, greatest(t1.bg, t2.bg) as bg,
              least(t1.nd, t2.nd) as nd
          from t1 inner join t2
          on t1.value <> t2.value
              and greatest(t1.bg, t2.bg) < least(t1.nd, t2.nd)
      
  • Разность?

Запросы

  • На текущий момент
    • select * from StudentGroups where nd = inf
      
  • На заданный момент
    • select * from StudentGroups
      where bg <= :time and :time < nd
      
  • Изменений
    • select * from StudentGroups
      
  • Статистика
    • select sum(cast(nd - bg as float) * price) 
               / sum(cast(nd - bg as float))
      from prices
      

Изменение текущих значений

  • Вставка
    • insert into StudentGroups(StudentId, GroupId, bg, nd)
          values (:StudentId, :GroupId, current_date, inf)
      
  • Изменение
    • update StudentGroups set nd = current_date
          where StudentId = :StudentId and nd = inf
      insert into StudentGroups(StudentId, GroupId, bg, nd)
          values (:StudentId, :GroupId, current_date, inf)
      
  • Удаление
    • update StudentGroups set nd = current_date
          where StudentId = :StudentId and nd = inf
      

Изменение значений в прошлом

  • Случай нескольких интервалов
  • Случай одного интервала

Случай нескольких интервалов

  • Укоротить первый
    • update StudentGroups set nd = :bg
      where StudentId = :SId and bg < :bg and :bg < nd
      
  • Укоротить последний
    • update StudentGroups set :bg = :nd
      where StudentId = :SId and bg < :nd and :nd < bg
      
  • Удалить промежуточные
    • delete from StudentGroups
      where StudentId = :SId and :bg <= bg and nd <= :nd
      
  • Вставить новый
    • insert into StudentGroups(StudentId, GroupId, bg, nd)
      values (:SId, :GroupId, :bg, :nd)
      

Случай одного интервала

  • Продублировать интервал
    • insert into StudentGroups
      select SId, GroupId, :nd, nd
      from StudentGroups
      where StudentId = :SId and bg < :bg and :nd < nd
      
  • Действовать как в случае нескольких интервалов

Представление данных

  • В месте с атрибутом хранится метка времени
    • Нет противоречий
    • Случайное изменение истории
    • Нет удалений

Пример

  • Информация о студенте
    • create table students (
          StudentId int not null primary key,
          FirstName varchar(100) not null,
          LastName varchar(100) not null,
      )
      create table StudentGroups (
          StudentId int not null references students(id),
          GroupId int not null references groups(id),
          When date,
          primary key (StudentId, GroupId, When)
      )
      

Запросы

  • На текущий момент?
    • argmax с условием
  • На заданный момент?
    • argmax с условием
  • Соединения?
    • Построить интервальное представление
  • Множественные операции?
    • Построить интервальное представление

Изменения

  • Текущих значений
    • insert into StudentGroups(StudentId, GroupId, When)
          values (:StudentId, :GroupId, current_date)
      
  • Изменение значений в прошлом
    • Семантика не ясна
  • Изменение значений на интервале
    • Аналогично интервальной модели

Выводы

  • Плюсы
    • Небольшая экономия памяти
    • Интуитивно понятна
  • Минусы
    • Случайное изменение истории
    • Нет удалений
    • Очень сложные запросы
    • Низкая производительность запросов

Литература

Содержание

Основная литература

  • Дейт К. Введение в системы баз данных (глава 23)
  • Celko J. SQL for Smarties (глава 4)
  • Gao D., Jensen C., Snodgrass R., Soo M. Join operations in temporal databases