6NF и исторические данные атрибута - PullRequest
6 голосов
/ 23 января 2012

При использовании базы данных, нормализованной в соответствии с принципами 6NF, как вы будете хранить исторические данные атрибутов?

Допустим, например, мы берем этот пример из @PerformanceDBA, но со следующим дополнительным требованием:

Нам нужно хранить исторические данные для всех наших продуктов, мы должны иметь возможность просто ввести дату и получить снимок атрибутов продукта в конкретный момент времени.

Более практичный пример :
Предположим, что диски и ЦП из приведенного выше примера являются виртуальными, и пользователь может изменить емкость диска по своему усмотрению.Как мы можем изменить базу данных, чтобы мы могли извлекать атрибуты данного диска в любое время в прошлом (конечно, после даты его создания), сохраняя представление 5NF достаточно быстрым.

Вещи Iрассматриваю

  • Добавьте столбец отметки времени ' изменили ' к каждой таблице атрибутов ( это приведет к довольно сложному запросу с подзапросом и объединению для каждой таблицы атрибутов)
  • Создать отдельную * таблицу истории для каждой таблицы атрибутов ( может привести к огромному количеству таблицы, поскольку у нас около 70 атрибутов, распределенных по 20 типам продуктов )
  • Дополнительно: добавьте индексированный столбец ' current ' в каждую таблицу атрибутов, чтобы ускорить просмотр 5NF

Любая помощь приветствуется!


Редактировать: Я знаю концепцию временных баз данных, но проблема в том, что для механизма баз данных, с которым я работаю (postgresql), временное расширение еще не полностью реализовано.Любой совет, как этого добиться без временных баз данных?

1 Ответ

9 голосов
/ 23 января 2012

Недавно утвержденный стандарт SQL: 2011 включает в себя функции, которые позволяют вам лучше справляться с такими проблемами, чем когда-либо прежде.

Не то, чтобы вы могли делать все, что хотелиделать на временной арене, но то, что было введено, действительно является довольно значительным улучшением.

Хорошая презентация об этом на http://metadata -standards.org / Document-library / Documents-by-number / WG2-N1501-N1550 / WG2_N1536_koa046-Temporal-features-in-SQL-standard.pdf .

Обратите внимание, что в его продукте SQL есть только один поставщик с разумной поддержкой этих функций, одиндругие, возможно, работают над этим, а третий открыл канал голосования для своих клиентов.

На сайте www.linkedin.com также есть дискуссионная группа «Temporal Data», посвященная именно вашей теме.

РЕДАКТИРОВАТЬ, пытаясь обратиться к «Любой совет о том, как этого добиться без временных баз данных?»

Не добавляйте только один тип даты / времени, столбецмн к вашим моделям.Первая причина, как вы указали, вторая причина заключается в том, что это решение также продвигается новым стандартом и будет способствовать переходу на механизмы, которые поддерживают новые функции, как только они станут доступны.

Поэтому добавьте ОБА в начало и конец столбца даты / времени.НЕ СДЕЛАЙТЕ ИХ НИЧЕГО.Новый стандарт требует этого для своих временных характеристик.Если конечный MIT (момент времени) все еще неизвестен, используйте самое высокое значение применимого типа времени, например 9999-12-31.

Вам НЕ НУЖНО создавать отдельные таблицы истории длякаждый атрибут ".В равной степени возможно иметь «одну таблицу сущностей», в которой хранится «история возникновения всей сущности».Недостатком является то, что будет трудно запрашивать, когда произошло изменение ACTUAL с каким-либо конкретным атрибутом (поскольку вы получаете новые исторические строки для любого изменения любого атрибута, возможно, копируя то же значение атрибута для большей частиатрибуты).«Одна таблица», вероятно, будет потребителем пространства, «отдельная история для каждого атрибута» может быть потребителем запроса времени ЦП.Это будет балансирование, и от того, где баланс точно зависит от вашей конкретной ситуации.

Не «добавляйте индексированный« текущий »столбец» в ваши таблицы.Во-первых, они не помогут вам перейти к новым функциям, когда они есть в вашем движке, а во-вторых, столбцы Y / N являются очень плохими различителями и, следовательно, очень плохими кандидатами для индексации.Я бы предпочел добавить ваш начальный или конечный показатель к индексу, поскольку можно ожидать, что он даст вам одинаковые выигрыши для «текущих» строк и лучший выигрыш для нетоковых строк всякий раз, когда вам нужно запросить эти.

Что касается применения ограничений базы данных, таких как неперекрытие периодов времени во временных ключах и включение периодов времени во временном RI, то вы просто сами по себе.Напишите необходимый код в триггерах, SPROC или коде приложения в порядке убывания предпочтений.

Было ли это более полезным?

...