Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Темпоральные базы данных: как построить машину времени

CUSTIS
April 24, 2014

Темпоральные базы данных: как построить машину времени

Открытый семинар для студентов в компании CUSTIS (24 апреля 2014 года).
Лектор: Максим Зинченко, ведущий разработчик Java/Oracle.

CUSTIS

April 24, 2014
Tweet

More Decks by CUSTIS

Other Decks in Programming

Transcript

  1. 24 апреля 2014 года Темпоральные базы данных: как построить машину

    времени Максим Зинченко Oracle/Java-разработчик
  2. Ему бы только деньги, деньги, деньги… Кто я? Что я

    здесь делаю?  Окончил МИФИ  В IT работаю 13 лет  Программирую 20 лет QBasic, C++, Pascal, С, Delphi, TSQL, PL/SQL, Java 1.3, C#, Java 1.7…  Работаю в CUSTIS 5 лет. Автоматизация банков 2/ 111
  3. За что я люблю CUSTIS  Зарплата  Бесплатные плюшки,

    чай, кофе…  Корпоративы, пятничные посиделки…  Расположение офиса  Можно работать удаленно  Нормальные рабочие места 3/ 111
  4. За что я люблю CUSTIS ♥ Есть у кого поучиться

    ♥ Свобода творчества ♥ Руководитель – ваш друг ♥ Прозрачность и рефлексия 4/ 111
  5. Роль памяти  Без памяти невозможно ощутить время  Память

    хранит прошлое  Мы помним события, в которых не участвовали  Память хранит и будущее 10/ 111
  6. Альтернативные модели  Ограниченность (начало и конец времен)  Недетерминированность

    (случайности)  Квантование (минимальная единица)  Неравномерность  Субъективность 12/ 111
  7. Какая же будет модель у нас?  Ограниченная по времени

     Недетерминированная (открытая)  Квантованная  Равномерная  Объективная 13/ 111
  8. Причины и следствия  Причины всегда в прошлом  Асимметрия

    времени: следствие не определяет причины  Меняя причины, можем получить другое следствие 14/ 111
  9. Что умеет машина времени? 1. Наблюдение за прошлым и будущим

    2. Изменение прошлого и будущего 3. ??? 4. PROFIT! 16/ 111
  10. Можно ли ее построить?  В реальном мире – видимо,

    нет  В виртуальном – можно, но сложно  Зачем же она тогда нужна такая? 17/ 111
  11. Необходимость наблюдений  Разборки по факту проблем  Анализ активности

    в прошлом  Анализ «что если?»  Принятие решений на основании будущего 20/ 111
  12. Необходимость изменений  Ошибки в прошлом  Запаздывание получения информации

     Осуществление действий в точное время (планирование) 21/ 111
  13. Парадоксы  Изменения в прошлом и будущем рождают «парадоксы» 

    На самом деле это просто коллизии причин и следствий  Парадоксы виртуального мира работают так же, как и в реальном 22/ 111
  14. Решения парадоксов  Все они сводятся к решению «парадокса дедушки»

     Многочисленные фантасты давно все написали 23/ 111
  15. Периоды действия  Гранулярность/квантование/единица  Непрерывные и непересекающиеся  Открытость

    краев Можно использовать закрытые края как открытые Вместо 13.03.2014 00:00 - 02.05.2014 00:00 Используем 13.03.2014 00:00 - 02.05.2014 23:59 Нет ли здесь проблемы? Имеем дырку 02.05.2014 23:59 - 03.05.2014 00:00 Окончание периода стало как бы открыто Дырка в 1 минуту 31/ 111
  16. Периоды действия  Гранулярность/квантование/единица  Непрерывные и непересекающиеся  Открытость

    краев Можно использовать закрытые края как открытые Вместо 13.03.2014 00:00 - 02.05.2014 00:00 Используем 13.03.2014 00:00 - 02.05.2014 23:59 Имеем дырку 02.05.2014 23:59 - 03.05.2014 00:00  Полная определенность на всем времени Нужны константы для начала и конца времен 32/ 111
  17. Линии времени  Линий (осей) времени может быть несколько График

    погашения: Янв 100 Фев 100 Мар 100 Апр 100 Май 100 … Давай 34/ 111
  18. Линии времени  Линий (осей) времени может быть несколько График

    погашения: … Мар 100 Апр 200 Май 95 Июнь 95 Июль 95 … 39/ 111
  19. Линии времени  Получаем графики  То есть одна ось

    времени у нас в графике  А вторая – ось реального времени Янв–Мар: Янв 100 Фев 100 Мар 100 Апр 100 Май 100 Июнь 100 … Апр–???: … Мар 100 Апр 200 Май 95 Июнь 95 Июль 95 … 40/ 111
  20. Линии времени  Парадокс в будущем здесь мы разрулили через

    ветвление  Можно было бы разрулить через слияние Янв 100 Фев 100 Мар 100 Апр 100 Май 100 Июнь 100 Апр 200 Май 95 Июнь 95 Янв 100 Фев 100 Мар 100 Апр 100 Май 100 Июнь 100 Апр 200 41/ 111
  21. Битемпоральность и ветвление Реальное время Апрельская ветка Январь Февраль Март

    Апрель Май Июнь Янв Фев Мар Апр Май Июнь Янв 100 Фев 100 Мар 100 Апр 100 Май 100 Июнь 100 Янв 100 Фев 100 Мар 100 Апр 100 Май 100 Июнь 100 Янв 100 Фев 100 Мар 100 Апр 200 Май 95 Июнь 95 Янв 100 Фев 100 Мар 100 Апр 100 Май 100 Июнь 100 Янв 100 Фев 100 Мар 100 Апр 200 Май 95 Июнь 95 Время внутри плана платежей 43/ 111
  22. Названия осей времени  Зависят от области применения  Обычно

    одна из осей соответствует реальному времени  Системное  Астрономическое  Реальное  Транзакционное  Эта ось отличается тем, что для нее значения времени задаются автоматом 44/ 111
  23. Названия осей времени  Прочие оси называют по-разному  Для

    обобщения их можно называть:  Бизнес-ось  Модельная ось  Ось валидности  Здесь больше свободы с указанием периодов 45/ 111
  24. Сущность  Идентификация (неизменность сути)  Человек сменил паспорт 

    У торта отрезали кусок  Документ породил документ  Отделимость  100 рублей наличными и на счету  Дырка от бублика  Протяженность во времени 46/ 111
  25. Факт  Соответствуют понятию Transaction fact в DWH  Сущность,

    у которой отобрали период  Часто изменения сущностей регистрируют как факт 47/ 111
  26. Агрегат  Копят результаты фактов в разрезе измерений  Искусственная

    вещь  Обычно нет ссылок на агрегат  Появляются и исчезают 48/ 111
  27. Создадим модель…  Используем наш пример про кредит Янв 100

    Фев 100 Мар 100 Апр 100 Май 100 Июнь 100 Апр 200 Май 95 Июнь 95 51/ 111
  28. Первый шаг  Имеем факт платежа с такими атрибутами: 

    Сумма – темпоральный  Дата платежа – на бизнес-оси  Период актуальности – на системной  Попробуем нарисовать таблицу… 52/ 111
  29. Первый шаг pay_date actual_from actual_to summ Янв Янв 100 Фев

    Янв … 100 Март Янв … 100 Апр Янв Март 100 Май Янв Март 100 Июнь Янв Март 100 Апр Апр … 200 Май Апр … 95 Июнь Апр … 95 Янв 100 Фев 100 Мар 100 Апр 100 Май 100 Июнь 100 Апр 200 Май 95 Июнь 95 53/ 111
  30. Первый шаг pay_date actual_from actual_to summ Янв Янв +∞ 100

    Фев Янв +∞ 100 Март Янв +∞ 100 Апр Янв Март 100 Май Янв Март 100 Июнь Янв Март 100 Апр Апр +∞ 200 Май Апр +∞ 95 Июнь Апр +∞ 95 Здесь можно использовать -∞ 54/ 111
  31. Второй шаг  У разных клиентов платежи отдельные  Появляется

    сущность «Клиент»  Клиент должен быть битемпоральным  Клиент это не факт, а сущность 55/ 111
  32. Второй шаг Ссылка на клиента Период действия на оси платежей

    Период действия на оси нашего времени 56/88 56/ 111
  33. Второй шаг pay_date client_id actual_from actual_to summ Янв 1 Янв

    +∞ 100 Фев 1 Янв +∞ 100 Март 1 Янв +∞ 100 Апр 1 Янв Март 100 Май 1 Янв Март 100 Июнь 1 Янв Март 100 Апр 1 Апр +∞ 200 Май 1 Апр +∞ 95 Июнь 1 Апр +∞ 95 id name actual_from actual_to business_from business_to 1 Клеент -∞ +∞ -∞ +∞ Платежи Клиенты Опечатка 57/ 111
  34.  Попробуем исправить опечатку  Мы хотим сохранить любую историю

     Получается, что любое изменение в Клиентах приведет к порождению новой записи: id name actual_from actual_to business_from business_to 1 Клеент -∞ 2014-04- 24 17:45:37 -∞ +∞ 2 Клиент 2014-04-24 17:45:37 +∞ -∞ +∞ Третий шаг Поскольку это опечатка  Кто заметил проблему? 58/ 111
  35. Третий шаг  Попробуем исправить опечатку  Мы хотим сохранить

    любую историю  Получается, что любое изменение в Клиентах приведет к порождению новой записи: id name actual_from actual_to business_from business_to 1 Клеент -∞ 2014-04-24 17:45:37 -∞ +∞ 2 Клиент 2014-04-24 17:45:37 +∞ -∞ +∞  Кто заметил проблему? 59/ 111
  36. Третий шаг id name actual_from actual_to business_from business_to 1 Клеент

    -∞ 2014-04-24 17:45:37 -∞ +∞ 2 Клиент 2014-04-24 17:45:37 +∞ -∞ +∞ pay_date client_id actual_from actual_to summ Янв 1 Янв +∞ 100 Фев 1 Янв +∞ 100 Март 1 Янв +∞ 100 Апр 1 Янв Март 100 Май 1 Янв Март 100 Июнь 1 Янв Март 100 Апр 1 Апр +∞ 200 Май 1 Апр +∞ 95 Июнь 1 Апр +∞ 95 Клиенты Платежи Мы не можем сослаться на все версии клиента 60/ 111
  37. Третий шаг client_id name actual_from actual_to business_from business_to 1 Клеент

    -∞ 2014-04-24 17:45:37 -∞ +∞ 1 Клиент 2014-04-24 17:45:37 +∞ -∞ +∞ pay_date client_id actual_from actual_to summ Янв 1 Янв +∞ 100 Фев 1 Янв +∞ 100 Март 1 Янв +∞ 100 Апр 1 Янв Март 100 Май 1 Янв Март 100 Июнь 1 Янв Март 100 Апр 1 Апр +∞ 200 Май 1 Апр +∞ 95 Июнь 1 Апр +∞ 95 Анкеты/верcии клиентов Платежи id 1 Клиенты 64/ 111
  38. Лишняя таблица Это можно сделать, если:  Нет ссылок на

    клиентов  Вы не считаете важными FK  Нет нужды рассматривать клиента как единое целое  Вы готовы делать ссылки не на клиента, а на версию клиента 66/ 111
  39. Альтернативы подходу версий  Подход «сущность + версии» – не

    единственный  Одна из популярных альтернатив: 6НФ  Посмотрим, что это такое… 68/ 111
  40. Шестая НФ  Пусть у клиента два темпоральных атрибута: имя

    и адрес name address Иванов Гагарина, 34 Иванов Ленина, 41 Иванов Мира, 12 Адрес меняется, имя остается 69/ 111
  41. Шестая НФ Имя клиента в отдельной таблице Адрес тоже в

    отдельной таблице Как и с версиями, здесь можно что-то оставить СРАВНИТЕ 70/ 111
  42. Как еще можно…  От EAV до NoSQL один шаг

     Можно смешать подходы по-разному  Часто акцентируются на текущих значениях 72/ 111
  43. Но вернемся обратно  Все альтернативы рассмотреть нереально  Вариант

    с версиями поддерживается лучше современными СУБД  Поэтому вернемся к нему… 73/ 111
  44. Получение данных  Нужно фиксировать даты по всем осям 

    Дату системного времени обычно ставят в +∞ или текущую  Пользователю остается выбрать бизнес- дату (или бизнес-даты) 75/ 111
  45. Получение данных Эта часть – как у обычных запросов Задаем

    бизнес-дату Задаем системную дату 76/ 111
  46. Контроль ссылок  Не все сущности полностью определены  Нужен

    контроль допустимости ссылки  Рассмотрим на примере системного времени… 77/ 111
  47. Контроль уникальности  Периоды не должны пересекаться для одной сущности

     Это условие не так легко понять при мультитемпоральной модели 81/ 111
  48. Внесение изменений  Ветвление  У новых версий actual_from ставим

    в текущий момент  Окончание обычно неизвестно  Укорачиваем при необходимости предыдущую запись 82/ 111
  49. Внесение изменений  Ветвление  У новых версий actual_from ставим

    в текущий момент  Окончание обычно неизвестно  Укорачиваем при необходимости предыдущую запись 83/ 111
  50. Внесение изменений  Изменения затрагивают бизнес-ось?  Здесь можно произвольно

    задавать период  Поэтому изменения могут вноситься в несколько периодов 84/ 111
  51. Внесение изменений  Изменения затрагивают бизнес-ось?  Здесь можно произвольно

    задавать период  Поэтому изменения могут вноситься в несколько периодов 85/ 111
  52. Внесение изменений  Изменения затрагивают бизнес-ось?  Здесь можно произвольно

    задавать период  Поэтому изменения могут вноситься в несколько периодов  Иногда они могут даже поглощаться 86/ 111
  53. Внесение изменений  Изменения затрагивают бизнес-ось?  Здесь можно произвольно

    задавать период  Поэтому изменения могут вноситься в несколько периодов  Иногда они могут даже поглощаться 87/ 111
  54. Внесение изменений  Эффект бабочки  Причинно-следственные связи  Изменение

    причины часто приводит к изменению следствия Меняет фамилию на Петров 88/ 111
  55. Внесение изменений  Эффект бабочки  Причинно-следственные связи  Изменение

    причины часто приводит к изменению следствия Меняет фамилию на Петров 89/ 111
  56. Внесение изменений  Эффект бабочки  Причинно-следственные связи  Изменение

    причины часто приводит к изменению следствия Меняет фамилию на Петров 90/ 111
  57. Агрегаты  Храним общую сумму платежей по годам: pay_year actual_from

    actual_to value 2013 -∞ +∞ 10000 2014 -∞ 01.04.2014 20100 2014 01.04.2014 +∞ 20200 Изменение суммы платежа Измерение: год (бизнес-ось) Период действия (системный) 91/ 111
  58. Агрегаты  Агрегат часто неявно связан с многими фактами и

    сущностями  Это затрудняет реализацию эффекта бабочки 92/ 111
  59. SQL-2011. Факты  Как же сделать факт? Одинаковые даты Темпоральная

    ссылка К сожалению, скорее всего, так работать не будет! 101/ 111
  60. SQL-2011. Запросы  На заданные бизнес и системную дату: Условие

    пишем отдельно для каждой таблички Предусмотрена фильтрация только одной оси, вторую приходится самим 102/ 111
  61. SQL-2011. Проблемы  Многословно  Включительные границы  Нет группировки

    по периоду  Трудно работать с 2+ количеством осей  Нет поддержки нестандартных типов периодов  Нет поддержки хранимых агрегатов 104/ 111
  62. IBM DB2 10+  Создание таблиц, в целом, такое же

     Для SYSTEM_TIME нужно вручную создавать табличку истории и привязывать  Добавили конструкцию 106/ 111
  63. Oracle DBMS 12+  Много мелких отличий от стандарта 

    Задание даты для системной оси:  Для системной оси ведутся специальные системные поля с данными об scn и операции  Требование date_to>date_from 107/ 111
  64. Что еще?  Получение среза связанных данных на конкретный момент

     Агрегаты  Альтернативы анкетам  Транзакционное/модельное время  Ограничения уникальности  Логическое удаление 108/ 111