Что такое обычные формы базы данных и можете ли вы привести примеры? [закрыто]

277

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

Поскольку большинство статей носят технический характер и поэтому сложнее для понимания, я прошу кого-нибудь написать более понятное объяснение, основанное на примерах того, что означают 1NF, 2NF, 3NF и даже 3,5NF (Бойс-Кодд).

barfoon
источник

Ответы:

435

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

2NF и 3NF - все зависит от первичного ключа. Напомним, что первичный ключ может состоять из нескольких столбцов. Как сказал Крис в своем ответе:

Данные зависят от ключа [1NF], всего ключа [2NF] и только от ключа [3NF] (так что помогите мне, Кодд ).

2НФ

Допустим, у вас есть таблица, содержащая курсы, которые проводятся в определенный семестр, и у вас есть следующие данные:

|-----Primary Key----|               uh oh |
                                           V
CourseID | SemesterID | #Places  | Course Name  |
------------------------------------------------|
IT101    |   2009-1   | 100      | Programming  |
IT101    |   2009-2   | 100      | Programming  |
IT102    |   2009-1   | 200      | Databases    |
IT102    |   2010-1   | 150      | Databases    |
IT103    |   2009-2   | 120      | Web Design   |

Это не в 2NF , потому что четвертый столбец полагается не на весь ключ, а только на его часть. Название курса зависит от идентификатора курса, но не имеет никакого отношения к тому, в каком семестре оно прошло. Таким образом, как вы видите, у нас есть дублирующаяся информация - несколько строк сообщают нам, что IT101 программирует, а IT102 - базы данных. Поэтому мы исправляем это, перемещая название курса в другую таблицу, где CourseID - это ВЕСЬ ключ.

Primary Key |

CourseID    |  Course Name |
---------------------------|
IT101       | Programming  |
IT102       | Databases    |
IT103       | Web Design   |

Нет избыточности!

3NF

Итак, допустим, мы также добавили имя учителя курса и некоторые подробности о них в СУРБД:

|-----Primary Key----|                           uh oh |
                                                       V
Course  |  Semester  |  #Places   |  TeacherID  | TeacherName  |
---------------------------------------------------------------|
IT101   |   2009-1   |  100       |  332        |  Mr Jones    |
IT101   |   2009-2   |  100       |  332        |  Mr Jones    |
IT102   |   2009-1   |  200       |  495        |  Mr Bentley  |
IT102   |   2010-1   |  150       |  332        |  Mr Jones    |
IT103   |   2009-2   |  120       |  242        |  Mrs Smith   |

Теперь, надеюсь, должно быть очевидно, что TeacherName зависит от TeacherID - так что это не в 3NF . Чтобы исправить это, мы делаем то же самое, что и в 2NF - вынимаем поле TeacherName из этой таблицы и помещаем его в свое собственное, в котором ключ TeacherID является ключевым.

 Primary Key |

 TeacherID   | TeacherName  |
 ---------------------------|
 332         |  Mr Jones    |
 495         |  Mr Bentley  |
 242         |  Mrs Smith   |

Нет избыточности!

Следует помнить одну важную вещь: если что-то не в 1NF, то оно не в 2NF или 3NF. Таким образом , каждая дополнительная нормальная форма требует все , что низшие нормальные формы имели, плюс некоторые дополнительные условия, которые должны все быть выполнены.

Smashery
источник
9
Просто подумайте об этом с точки зрения отношений между вещами. Если я спрошу вас «как называется курс с ID IT101?», Вы можете дать мне ответ, верно? Точно так же, если я спрошу вас, "у какого учителя есть ID 332?" Вы можете сказать мне, что это за учитель. Таким образом, название курса зависит от его идентификатора.
Smashery
9
Тем не менее, вы не можете пойти другим путем - если бы я спросил вас: «Каково удостоверение личности мистера Джонса?» Вы не сможете дать уникальный ответ, так как может быть два мистера Джонса. Таким образом, идентификатор не зависит от имени - это имя зависит от идентификатора.
Smashery
2
Вы также можете думать об этом так - посмотрите на третью таблицу внизу (первую с именем TeacherName в ней). Что мешает мне иметь «Мистер Джонс» в первом ряду, но потом поставить «Мистер Блоггс» во втором ряду? Я не должен допускать , чтобы сделать это, потому что они оба получили идентификатор 332.
Smashery
30
@instantsetsuna - Полное объяснение: в некоторых судах свидетеля спрашивают, скажут ли они: «Правда, вся правда и ничего, кроме правды, поэтому помоги мне, Бог»; поскольку Бог считается тем, у кого есть власть, когда дело доходит до знания, говорите ли вы правду. В случае баз данных мы можем сказать: «Данные зависят от ключа, всего ключа и только ключа, поэтому помогите мне, Кодд». Тед Кодд - один из тех, кто придумал идею реляционных баз данных - вещей, основанных на ключах и т. Д., Так что он будет авторитетом в случае реляционных баз данных.
Smashery
5
@Smashery В чем разница между 2NF и 3NF?
Зо
119

У меня никогда не было хорошей памяти для точной формулировки, но в моем классе базы данных, я думаю, профессор всегда говорил что-то вроде:

Данные зависят от ключа [1NF], всего ключа [2NF] и только от ключа [3NF].

Крис Шаффер
источник
72
... так что помоги мне, Кодд. en.wikipedia.org/wiki/Ted_Codd
Smashery
6
Так в чем же разница The data depends on the key [1NF], nothing but the key [3NF]? Пожалуйста, не путайте нас, так как ответ в 1 предложении не разъясняет ответ, но сбивает с толку посетителей!
Пратик
2
«каждая ячейка в таблице должна содержать только один фрагмент информации, и не может быть повторяющихся строк». - Я не вижу, как «данные зависят от ключа» соответствует всему этому.
Саймон Форсберг,
46

Вот быстрый, по общему признанию зарезанный ответ, но в предложении:

1NF: Ваша таблица организована как неупорядоченный набор данных, и в ней нет повторяющихся столбцов.

2NF: вы не повторяете данные в одном столбце таблицы из-за другого столбца.

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

Для более подробной информации, смотрите Википедию ...

Дэйв Маркл
источник
1
Насколько я могу судить, отказ 1NF от повторяющихся групп относится не к повторяющимся столбцам, а к отдельным столбцам, которые представляют произвольное количество повторяющихся значений для одного и того же атрибута, то есть не являются атомарными. Я основываю это, например, на (1) stackoverflow.com/questions/23194292/… / (2) stackoverflow.com/questions/26357276/…
underscore_d
34

1NF: только одно значение на столбец

2NF: все столбцы не первичного ключа в таблице должны зависеть от всего первичного ключа.

3NF: все столбцы не первичного ключа в таблице должны НЕПОСРЕДСТВЕННО зависеть от всего первичного ключа.

Я написал статью более подробно здесь

Арктур
источник
Потому что вы не предоставили атрибуцию. Я отредактировал ответ, чтобы обеспечить атрибуцию.
Роберт Харви,
По возможности, включайте пример в сам ответ. Обычный пользователь должен иметь возможность прочитать ваш ответ и получить от него некоторую ценность, не нажимая на ссылку в блоге. Другими словами, ответ должен быть самодостаточным.
Роберт Харви
Я запомню это. Спасибо :)
Arcturus
3
Также обратите внимание, что этому вопросу два года, и у него уже есть ответ с высоким рейтингом, который был помечен как принятый ФП. Поздние ответы более тщательно изучаются сообществом, чтобы оценить, добавляют ли они подлинную дополнительную ценность ОП.
Роберт Харви
3
@Arcturus прочитал статью, все еще одно из лучших объяснений нормализации.
Olian04