Нормализация базы данных и повторяющиеся значения - PullRequest
2 голосов
/ 16 января 2011

Рассмотрим структуру Parent / Child / GrandChild в схеме таблицы базы данных или даже более глубокую иерархию.Они находятся в одном агрегате.Одна таблица DAYS содержит одну строку в день и имеет поле «Дата».Это корневая таблица или, может быть, дочерняя от корня.Ни одна строка не может быть удалена в этой таблице.

В этом случае, какой бы сложной ни была моя схема таблицы, как бы далеко ни была иерархия любой другой таблицы, есть ли причина, по которой любая другая таблица будет содержать значение Date?Не может ли он просто иметь FK для таблицы DAYS.

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

Ответы [ 4 ]

1 голос
/ 16 января 2011

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

Обратите внимание, что некоторые системы РСУБД имеют более эффективный тип данных только для дат (SQL Server имеет такой же, как в SQL Server 2008).Точно так же часто PK в измерении даты представляет собой целое число в натуральной форме YYYYMMDD, которое занимает значительно меньше места, чем обычный столбец datetime.

Такая схема может иметь преимущества.У вас могут быть специальные зарезервированные измерения для определенных дат с очень специфической семантикой - -1 - неизвестно, -2 - недействительно, -3 - ожидание и т. Д., В то время как обычный столбец даты имеет возможность хранить действительную дату или NULL.

Я не думаю, что объединения обязательно являются аргументом против этого по соображениям производительности, в конце концов, у вас, вероятно, будет очень эффективная индексация по этому вопросу, и это приведет к поиску индекса.С другой стороны, типичная таблица измерений даты имеет много столбцов, и в сценарии OLTP большая часть этого вам редко требуется.

Если ваше приложение выполняет подробный анализ дат и создание отчетов, я бы рассмотрел измерение даты (или назовите это справочной таблицей, поскольку вы, скорее всего, не находитесь в сценарии измерений / хранилища данных).В противном случае я бы этого не сделал - большинству людей было бы неудобно с этим, и знакомство с методами пространственного моделирования не распространено среди многих (большинства?) Практиков OLTP, и они не увидят преимуществ, хотя их явно много.

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

Опять же, SQL Server 2008 имеет отдельное время- только тип данных, поэтому простого разделения DATE и TIME в вашей таблице может быть более чем достаточно.

1 голос
/ 16 января 2011

Да, ваша таблица может ссылаться на таблицу DAYS, но я не стал бы спрашивать причину для сохранения только значения Date. Я хотел бы попросить причину ввести это новое отношение, которое замедлит вашу базу данных и не имеет - по крайней мере на основе вашего описания - никакой дополнительной ценности. Подумайте о том, чтобы представить таблицу со всеми возможными целыми числами и сослаться на нее из всех других таблиц. Это возможно, но не имеет особого смысла. Ваш пример довольно близок к этому.

1 голос
/ 16 января 2011

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

Взгляните на Проектирование исторических таблиц .

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

Не пытайтесь без необходимости создавать модель для времени.Опять же, это будет зависеть от бизнес-процесса, который вы пытаетесь смоделировать, и от типа решения для базы данных OLTP / OLAP, которое вы хотите внедрить.

Для решений OLTP вы обычно пытаетесь записать определенное время (например, тип данных datetime), что события действительно происходят, в отличие от моделирования всех возможных значений времени и стремления связать релевантное время с событиями.После этого вы можете сосредоточиться на потребностях в отчетах или презентациях.

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

0 голосов
/ 16 января 2011

Если вы используете внешний ключ, вам нужно найти реальное значение в другой таблице. Возможно, вам нужно сэкономить место, но внешний ключ по-прежнему составляет пару байтов, и вам потребуется индекс для таблицы дней, чтобы ускорить поиск

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...