Считает ли добавление поля «ID» в таблицы базы данных в соответствии с третьей нормальной формой ошибкой? - PullRequest
6 голосов
/ 08 ноября 2010

Можно ли добавить поле «ID» в качестве первичного ключа ко всем таблицам моей базы данных, а также использовать его для создания отношений между таблицами?Будет ли этот дизайн рассматриваться как дизайн 3NF (третья нормальная форма)?Если да, то рекомендуется ли это теоретически или нет?

Ответы [ 5 ]

7 голосов
/ 10 ноября 2010

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

Если да, рекомендуется ли это теоретически или нет?

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

На самом деле это, к сожалению, очень распространенный, быстрый и грязный метод создания электронных таблиц (которые разработчик приложения определил для своего приложения) вписывается в «базу данных» контейнер такие как MS SQL. Без выполнения каких-либо подлинных работ по проектированию или моделированию базы данных, которые требуются для содержимого контейнера, чтобы квалифицироваться как реляционная база данных. Хорошо подходит для создания прототипа или подтверждения концепции, но не готов к любой форме разработки (кодирование SQL).

Можно ли добавить поле «ID» в качестве первичного ключа ко всем таблицам моей базы данных, а также использовать его для установления связей между таблицами?

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

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

Результатом является существенное дублирование данных; обновить аномалии; много других показателей; большие «реляционные» наборы данных; низкая производительность; массовое чрезмерное использование временных таблиц; сложный SQL, которого можно избежать с помощью подлинного проектирования баз данных.

Будет ли этот дизайн рассматриваться как проект 3NF (третья нормальная форма)?

Нормализация является частью (не всем) процесса проектирования базы данных. 3NF достигается через этот процесс. 3NF или любой другой NF, не является этикеткой, которая может быть размещена на множестве электронных таблиц или частично разработанного содержимого контейнера, не проходя процесс и, таким образом, зарабатывая значок. Никто не «рассматривает» кучу электронных таблиц или частично разработанное содержимое 3NF; оценивается, были ли соблюдены правила нормализации, и если эти правила не нарушаются, то это справедливо обозначается как 3NF. Поскольку процесс нормализации не соблюдался, нет оснований предполагать, что он может относиться к любой нормальной форме.

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

Общее представление о проблеме

«Идентификаторы» - это суррогатные ключи. Суррогатные ключи - это всегда (вы правы) дополнительный ключ и индекс , дополнительный к существующему PK, который собирается узурпировать. Конечно, это требует значительных затрат производительности при каждом доступе.

У некоторых спрашивающих есть идея, что суррогатные ключи могут использоваться вместо PK.Что, конечно, неверно, и вы понимаете, что, с такой благодарностью, что здесь нет необходимости обращаться к этому.

Понятие «все суррогатные ключи» или «нет суррогатных ключей» - это вид черного или- белая бессмысленная ерунда, которая является нормальной для детей, но неприемлемой для взрослых, особенно для тех, кто занимается ИТ-работой, что требует точности и понимания.Для маленького ребенка вполне нормально думать "если папа не позволяет мне делать то, что я хочу, он меня не любит", и, следовательно, ", если он меня не любит, он ненавидит меня ".Большинство из нас понимают, что жизнь немного сложнее, чем к возрасту начальной школы.Разработчики, которые «любят» видеть «идентификаторы» в каждой таблице и «не любят» их отсутствие в некоторых таблицах, по определению не способны рассматривать базу данных в целом и потребности других разработчиков и пользователей;они думают только об упрощенном коде «одна таблица за раз».

Это также , а не о оттенках серого или размытых определениях.Нет, определения не изменились за 30 лет (они были расширены и уточнены, но они не изменились).Оттенки серого позволяют разработчикам избегать соответствия стандартам.Так что это тоже не рекомендуется.

Что такое подлинная реляционная база данных?

Правда в том, что если база данных была честно смоделирована и спроектирована, с помощью квалифицированных данныхМодельер, используя методологии, которые доступны в течение 30 лет, в итоге получит подлинно реляционную базу данных.И если бы они не следили за процессом, это не было бы ни реляционной, ни базой данных.Идентификаторы и отношения уже будут определены, и значение, контекст этого будет перенесен в различные таблицы.Данные будут нормализованы до 3NF или BCNF или 5NF, и аномалий обновления не будет.На последнем шаге , как части формального процесса, и , а не вне его, при переводе логического в физическое модельер может улучшить производительность некоторые Идентификаторы, добавляя суррогатные ключи и избегая переноса больших (широких) ключей в связанные дочерние таблицы (1).Это еще раз доказывает, с другого подхода, почему понятие нулевых суррогатов, или всех суррогатов, является детским и полностью исключено из подлинного процесса.

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

Легко доказано

Конечно, все, что я изложил, может быть легко доказано: просто отправьте DDL от 5 до 10 ваших электронных таблиц, мне нужна глубина не менее четырех (great.grand.parent⇢grand.parent⇢parent⇢child).

Вас может заинтересовать, я недавно опубликовал информацию о вашем вопросе в связанных вопросах , которые я здесь не повторяю.

Примечание

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

  2. Я согласен с заявлениями Эрвина о ключах и идентификаторах, и поэтому я не повторял их в своем ответе.

5 голосов
/ 08 ноября 2010

"Можно ли добавить поле" ID "в качестве первичного ключа ко всем таблицам моей базы данных, а также использовать его для создания отношений между таблицами?"

Вы явно намереваетесь добавлять суррогатные удостоверения личности повсюду, вслепую и не задумываясь. Думать, что все в порядке, так же глупо, как делать это. «Хорошие» идентификаторы обладают свойствами уникальности (в противном случае, очевидно, это не будет большой частью идентификатора), стабильности (их значения меняются нечасто), и фамильярности (их значения обозначают что-то значимое в Мир пользователя - мир за пределами ИТ-системы).

Обратите внимание, что я использовал слово «идентификаторы» вместо «ключей» очень сознательно. Ключи обладают свойством уникальности по определению. Следовательно, все ключи являются действительным кандидатом на роль идентификатора. Какой ключ вы на самом деле выберете для действия в качестве идентификатора, должен зависеть от того, насколько или мало какой-либо конкретный ключ также удовлетворяет критериям стабильности и знакомства.

Естественные ключи могут недостаточно удовлетворять критерию стабильности (но степень, в которой они работают, обычно сильно переоценена, как правило, разработчиками, которые слишком мало думают о стороне пользователя и слишком много о собственной стороне проблемы). Сгенерированные системой идентификаторы с абсолютной уверенностью нарушают критерий «знакомства».

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

«Будет ли этот дизайн рассматриваться как проект 3NF (третья нормальная форма)? Если да, рекомендуется ли это теоретически или нет?»

Если вы «добавите столбец идентификатора в существующий дизайн», то это не повлияет на NF. Независимо от NF, в котором был ваш существующий дизайн, дизайн с добавленным идентификатором будет иметь тот же NF.

2 голосов
/ 08 ноября 2010

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

Если вы говорите о суррогатном ключе (ключе, который не имеет значения в бизнес-сфере) тогда для большинства целей важным моментом является то, что такой ключ не должен быть ЕДИНСТВЕННЫМ ключом какой-либо таблицы.У вас также должен быть естественный ключ (бизнес-ключ AKA), чтобы данные не дублировались.

0 голосов
/ 08 ноября 2010

Я полностью согласен с @jlouis, что

3NF или Бойс-Кодд - теоретические идеи
Исходя из моей практики, я могу сказать, что использование естественного ключа является хорошим выбором только в справочных таблицах поиска, при условии, что поле ключа в реальном мире уникально и не равно нулю и не изменяется во времени. В других случаях использование суррогатного ключа гораздо предпочтительнее (с моей точки зрения): это просто более удобный способ создания таблиц, несмотря на все то, что нам говорят 3NF или Boyce-Codd.
0 голосов
/ 08 ноября 2010

Если я вас правильно понимаю,

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

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

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

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