Хотелось бы понять 6NF с примером - PullRequest
39 голосов
/ 28 января 2011

Я только что прочитал аргументы @ PerformanceDBA re: 6NF и E-A-V. Я заинтригован. Ранее я скептически относился к 6NF, поскольку он представлялся как «просто» наклеивание столбцов временных меток на таблицы.

Я всегда работал со словарем данных, и мне не нужно убеждать его использовать или генерировать код SQL. Поэтому я ожидаю ответа, для которого потребуется словарь (или каталог), который используется для генерации кода.

Итак, я хотел бы знать, как 6NF справится с чрезвычайно простым примером. Таблица предметов, описания и цены. Цены меняются со временем.

Так или иначе, как выглядит таблица Предметов при конвертации в 6NF? Что такое "взрыв столов"? что здесь происходит?

Если пример не работает с такой простой таблицей, не стесняйтесь добавлять то, что необходимо для прояснения сути вопроса.

Ответы [ 4 ]

41 голосов
/ 30 января 2011

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

Во-первых, у меня нет четкого представления о вашем уровне фактических знаний о реляционных базах данных и 5NF;У меня нет отправной точки, чтобы заняться и затем обсудить особенности 6NF,

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

Я надеюсь, вы понимаете, что некоторые таблицы могут быть "в 5NF", а другие - "в 6NF".".

Так что я собрал один для вас.Но даже это требует объяснения.

Теперь SQL едва поддерживает 5NF, он вообще не поддерживает 6NF (я думаю, что dportas говорит одно и то же в разных словах).Теперь я внедряю 6NF на глубоком уровне, по соображениям производительности, упрощенного поворота (целых таблиц; любых и всех столбцов, а не глупой функции PIVOT в MS), доступа к столбцам и т. Д. Для этого вам нужен полный каталог, который являетсярасширение каталога SQL, чтобы поддержать 6NF, который не поддерживается SQL, и поддерживать целостность данных и бизнес-правила.Таким образом, вы действительно не хотите внедрять 6NF для удовольствия, вы делаете это только в том случае, если у вас есть необходимость, потому что вам нужно реализовать каталог.(Это то, чего не делает группа EAV, и именно поэтому большинство систем EAV сталкиваются с проблемами целостности данных. Большинство из них не используют декларативную ссылочную и целостность данных, как у SQL.)

Но большинство людей, которые внедряют 6NF, не реализуют более глубокий уровень с полным каталогом.Они имеют более простые потребности и, следовательно, реализуют более низкий уровень 6NF.Итак, давайте возьмем это, чтобы предоставить простой пример для вас.Давайте начнем с обычной таблицы Product, которая объявлена ​​в 5NF (и не будем спорить о том, что такое 5NF).Компания продает различные виды Продуктов, половина столбцов обязательна, а другая половина является необязательной, что означает, что в зависимости от Типа продукта некоторые столбцы могут иметь значение Null.Несмотря на то, что они, возможно, хорошо поработали с базой данных, пустые значения теперь представляют собой большую проблему: столбцы, которые должны быть не пустыми для определенных типов продуктов, имеют нулевое значение, поскольку в объявлении указывается значение NULL, а код их приложений так же хорош, как и у следующего парня..

Поэтому они решили пойти с 6NF, чтобы решить эту проблему, потому что подзаголовок 6NF гласит, что он устраняет Нулевую проблему .Шестая нормальная форма является неприводимой нормальной формой, после этого больше не будет NF, потому что данные не могут быть нормализованы дальше.Строки были максимально нормализованы.Определение 6NF:

таблица имеет формат 6NF, когда строка содержит первичный ключ и не более одного атрибута.

Обратите внимание, что по этому определению миллионы таблиц по всей планете уже находятся в 6NF, не имея этого намерения.Например.Типичные справочные или справочные таблицы, только с PK и описанием.

Справа.Итак, наши друзья смотрят на свою таблицу Product, которая имеет восемь неключевых атрибутов, поэтому, если они сделают таблицу Product 6NF, у них будет восемь таблиц Sub-Product.Кроме того, существует проблема, заключающаяся в том, что некоторые столбцы являются внешними ключами для других таблиц, что приводит к дополнительным сложностям.И они отмечают тот факт, что SQL не поддерживает то, что они делают, и им приходится создавать небольшой каталог.Восемь таблиц правильны, но не разумны.Их цель состояла в том, чтобы избавиться от Nulls, а не писать маленькие подсистемы вокруг каждой таблицы.

Простой пример 6NF

Читатели, не знакомые со Стандартом моделирования реляционных баз данных, могут найти Обозначение IDEF1X полезным для интерпретации символов в примере.

Так, как правило, в Таблице продуктов сохраняются все обязательные столбцы, особенно FK, и каждый дополнительный столбец, каждый столбец, допускающий значение Nullable, помещается в отдельную таблицу вспомогательных продуктов. Это самая простая форма, которую я видел. Пять столов вместо восьми. В модели четыре таблицы субпродуктов "в 6NF"; основная таблица продуктов "в 5NF".

Теперь нам действительно не нужно, чтобы каждый сегмент кода, который ВЫБИРАЕТ из Продукта, должен был выяснить, какие столбцы он должен построить, основываясь на ProductType и т. Д., Поэтому мы предоставляем представление, которое по существу обеспечивает 5NF-представление Таблица продуктов кластера.

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

Обновление

Важно отметить, что я внедряю все Бизнес-правила в базе данных. В противном случае это не база данных (понятие реализации правил "в коде приложения" крайне весело, особенно в наши дни, когда у нас есть флористы, работающие как "разработчики"). Поэтому все правила и т. Д. В первую очередь реализуются как декларации SQL, ограничения CHECK, функции и т. Д. Это сохраняет всю декларативную ссылочную целостность и декларативную целостность данных. Расширение каталога SQL охватывает область, для которой в SQL нет объявлений , и они затем реализуются как SQL. Будучи хорошим словарем данных, он делает гораздо больше. Например. Я не пишу Представления каждый раз, когда я изменяю таблицы или добавляю или изменяю столбцы или их характеристики, они создаются непосредственно из каталога + расширение с помощью простого генератора кода.

Еще одно очень важное замечание. Вы не можете реализовать 6NF (или EAV должным образом, в этом отношении), не выполнив полное и верное упражнение нормализации, до 5NF. Проблема, которую я вижу на каждом сайте, состоит в том, что у них нет подлинного состояния 5NF, у них есть смесь частичной нормализации или вообще никакой нормализации, но они очень привязаны к этому. Создание 6NF или EAV из этого - катастрофа. Создание EAV или 6NF из этого без всех бизнес-правил, реализованных в декларативном SQL , - ядерная катастрофа, горящая годами. Вы получаете то, за что платите.

Конец обновления.

Наконец, да, есть как минимум еще четыре уровня нормализации (нормализация - это принцип, а не просто ссылка на нормальную форму), которые можно применять к этому простому кластеру продуктов 6NF, предоставляя больший контроль, меньше таблиц, и т.д. Чем глубже мы пойдем, тем обширнее каталог. И более высокие уровни производительности. Когда вы будете готовы, просто спросите, я уже установил модели и разместил детали в других ответах.

29 голосов
/ 29 января 2011

В двух словах, 6NF означает, что каждое отношение состоит из ключа-кандидата и не более одного другого (ключевого или неключевого) атрибута.Например, если «элемент» идентифицируется с помощью ProductCode, а другие атрибуты - «Описание» и «Цена», то схема 6NF будет состоять из двух отношений (* обозначает ключ в каждом):

ItemDesc {ProductCode*, Description}
ItemPrice {ProductCode*, Price}

Это потенциально очень гибкий подход, потому что он минимизирует зависимости.Это также его основной недостаток, особенно в базе данных SQL.SQL затрудняет или делает невозможным применение многих ограничений для нескольких таблиц.Используя приведенную выше схему, в большинстве случаев будет невозможно обеспечить соблюдение бизнес-правила, согласно которому у каждого продукта всегда должно быть описание И цена.Точно так же вы не сможете применить некоторые составные ключи, которые должны применяться (поскольку их атрибуты могут быть разбиты по нескольким таблицам).

Таким образом, при рассмотрении 6NF необходимо взвесить, какие зависимости и правила целостности важнытебе.Во многих случаях вам может показаться более практичным и полезным придерживаться 5NF и нормализовать не дальше.

6 голосов
/ 04 февраля 2011

Я ранее скептически относился к 6NF как это было представлено как «просто» вставлять некоторые столбцы отметки времени на таблицы.

Я не совсем уверен, откуда это очевидное заблуждение. Возможно, тот факт, что 6NF был представлен для книги «Временные данные и реляционный режим» Дейтом, Дарвеном и Лоренцосом? В любом случае, я надеюсь, что другие ответы здесь прояснили, что 6NF не ограничивается временными базами данных.

Я хотел бы подчеркнуть следующее: хотя 6NF является "академически респектабельным" и всегда достижимым, оно не обязательно может привести к оптимальному дизайну в каждом случае (и не только при рассмотрении реализации с использованием SQL). Даже вышеупомянутые первооткрыватели и сторонники 6NF, похоже, согласны, например,

Крис Дата : «В практических целях придерживайтесь 5NF (и 6NF)».

Хью Дарвен : "разложение 6NF вокруг Даты [не человек!] Было бы излишним ... оптимальный дизайн для футбольного клуба - это ... 5 с небольшим NF" ! "

Хью Дарвен : «мы находимся в 5NF, но не в 6NF, и снова достаточно 5NF» (несколько похожих примеров).

Опять же, я также могу найти доказательства обратного:

Крис Дата : «Мы с Дарвеном какое-то время чувствовали, что все базовые релвары должны быть в 6NF».

В качестве практического замечания я недавно расширил схему SQL одного из наших продуктов, добавив небольшую функцию. Я принял 6NF, чтобы избежать обнуляемых столбцов, и в итоге получил шесть новых таблиц, где большинство (все?) Моих коллег использовали бы одну таблицу (или, возможно, расширили существующую таблицу) с обнуляемыми столбцами. Несмотря на то, что я доказал наличие нескольких «вспомогательных» хранимых процедур и «денормализованного» * ​​1027 * с триггерами INSTEAD OF, каждый кодер, которому приходилось работать с этой функцией на уровне SQL, старался изо всех сил проклинать меня:)

3 голосов
/ 02 марта 2011

У этих ребят это есть: Моделирование якоря .Отличные академические работы по этому вопросу в сочетании с практическими примерами.Их труды, наконец, заставили меня задуматься о создании DW в 6nf для будущего проекта.Выполненная мною работа POC подтвердила (по крайней мере для меня), что огромные преимущества 6nf не перевешивают затраты.

...