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

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

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


person barfoon    schedule 07.04.2009    source источник


Ответы (4)


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

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

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

2NF

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

|-----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   |

Никакой избыточности !!

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

person Smashery    schedule 07.04.2009
comment
Спасибо за это - именно то, что я искал. В примере с 2NF - как именно название курса зависит от его идентификатора? Как имя учителя зависит от идентификатора? - person barfoon; 07.04.2009
comment
Просто подумайте об этом с точки зрения отношений между вещами. Если я спрошу вас, как называется курс с идентификатором IT101? Вы можете дать мне ответ, верно? Точно так же, если я спрошу вас, у какого учителя ID 332? вы можете сказать мне, что это за учитель. Таким образом, название курса зависит от его идентификатора. - person Smashery; 07.04.2009
comment
Однако вы не можете пойти другим путем - если бы я спросил вас, какое удостоверение личности мистера Джонса? возможно, вы не сможете дать однозначный ответ, поскольку мистера Джонса может быть двое. Таким образом, идентификатор не зависит от имени - это имя зависит от идентификатора. - person Smashery; 07.04.2009
comment
Вы также можете думать об этом так - посмотрите на третью таблицу (первая с именем TeacherName). Что мешает мне поставить мистера Джонса в первом ряду, а во втором - поставить мистера Блогса? Мне нельзя разрешить это, потому что у них обоих ID 332. - person Smashery; 07.04.2009
comment
Но если вы спроектируете свою таблицу так, чтобы ее не было в 3NF, ничто не помешает вам написать два разных имени для одного идентификатора - и тогда ваша база данных противоречит сама себе! - person Smashery; 07.04.2009
comment
Что нужно понимать для 2NF, так это то, что если вы знаете идентификатор курса, вы уже знаете его название - вам также не нужен его семестр! Это все равно что сказать «Хорошо», значит, ваш номер ученика 314156, но я не могу определить ваше имя. Назови свой любимый цвет Красный О, ты, должно быть, Джонни - person Smashery; 07.04.2009
comment
Номер студента однозначно идентифицирует вас - вам не нужно ничего знать. В строке базы данных не будет указано, что вы Джонни, потому что ваш любимый цвет - красный - в ней будет указано, что вы Джонни, потому что ваш студенческий билет 314156. Таким образом, ваше имя зависит от идентификатора и только ID. - person Smashery; 07.04.2009
comment
Я вижу это, поэтому помогите мне, Кодд, во многих местах, что это значит? - person instantsetsuna; 11.08.2010
comment
@instantsetsuna - en.wikipedia.org/wiki/Ted_Codd - person Smashery; 12.08.2010
comment
@instantsetsuna - Полное объяснение: в некоторых судах свидетелей спрашивают, скажут ли они правду, всю правду и ничего, кроме правды, да поможет мне Бог; поскольку считается, что Бог обладает властью, когда речь идет о знании того, что вы говорите правду. В случае с базами данных мы можем сказать, что данные зависят от ключа, всего ключа и ничего, кроме ключа, так что помогите мне, Кодд. Тед Кодд - тот, кто придумал идею реляционных баз данных - вещей, основанных на ключах и т. Д., Так что он будет авторитетом в случае реляционных баз данных. - person Smashery; 12.08.2010
comment
Теперь я понимаю, спасибо, что нашли время объяснить! :) - person instantsetsuna; 12.08.2010
comment
пожалуйста, дайте также пример 1nf .. - person XMen; 16.10.2012
comment
ваша колонка "Семестр" просто заставляет меня заткнуть рот, вы нарушаете очень важное правило, объединяя две колонки в одну. вам нужно проделать манипуляции со строками, чтобы вырваться из года. - person KM.; 23.10.2012
comment
Эта inst 2NF причина 1NF говорит, что каждое поле должно хранить только атомарные значения. Хранение 2009-1 в одном поле никоим образом не атомарно. - person ; 22.03.2013
comment
@TaylorGibb Конечно, это так - эти значения являются просто внешними ключами в другой таблице, которую я здесь не показывал, называемой Semesters, которая имеет идентификатор (например, 2009-1), дату начала и дату окончания. Тот факт, что эти идентификаторы выглядят как фактические даты семестра, является чистой случайностью ;-) - person Smashery; 26.03.2013
comment
@Smashery, хахаха, я вижу, что ты там делал;) - person ; 26.03.2013
comment
@Smashery Не могли бы вы обновить свой эпический ответ, добавив BCNF - person mko; 04.11.2013
comment
@Smashery В чем разница между 2NF и 3NF? - person Zo Has; 22.07.2015
comment
это «Данные зависят от ключа [1NF], всего ключа [2NF] и ничего, кроме ключа [3NF] (так что помоги мне, Кодд)» чрезвычайно полезно для усвоения и упрощения основ нормализации. Я так понимаю, это устройство более широко известно среди администраторов баз данных? - person Mr.Budris; 22.12.2016
comment
отличный ответ, помогает мне легко это понять. Но, как и некоторые другие, я не сразу вижу разницу между 2NF и 3NF. - person Harry; 13.03.2017
comment
Почему в объектно-ориентированном программировании нет нормализации? - person Lealo; 15.08.2017
comment
Как насчет чего-то вроде, | From_ID, From_Name, To_ID, To_Name | Я считаю, что это 1NF, но не совсем уверен, почему ...? - person Marais Rossouw; 02.09.2018
comment
@Smashery имя учителя совершенно не зависит от первичного ключа (Courser + Semester). Так почему это нарушило 3NF? Я считаю, что это больше нарушает 2NF, т.е. таблица не должна содержать 2 разных типа данных. - person Qiulang; 04.01.2019

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

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

person Chris Shaffer    schedule 07.04.2009
comment
... так что помоги мне, Кодд. en.wikipedia.org/wiki/Ted_Codd - person Smashery; 07.04.2009
comment
Так в чем разница между The data depends on the key [1NF], nothing but the key [3NF]? Пожалуйста, не путайте нас, так как 1 ответ не проясняет ответ, а сбивает с толку посетителей! - person Pratik; 04.10.2015
comment
каждая ячейка в таблице должна содержать только одну часть информации, и не может быть повторяющихся строк. - Я не понимаю, как данные зависят от ключа, совпадающего со всем этим. - person Simon Forsberg; 14.07.2017

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

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

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

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

Подробнее см. Википедию ...

person Dave Markle    schedule 07.04.2009
comment
Насколько я могу судить, отказ 1NF от повторяющихся групп относится не к повторяющимся столбцам, а к отдельным столбцам, которые представляют произвольное количество повторяющиеся значения для одного и того же атрибута, т. е. не атомарны. Я основываю это, например, на (1) stackoverflow.com/questions/23194292 / / (2) stackoverflow .com / questions / 26357276 / - person underscore_d; 30.03.2017

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

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

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

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

person Arcturus    schedule 22.10.2012
comment
Потому что вы не указали авторство. Я отредактировал ответ, чтобы указать авторство. - person Robert Harvey; 23.10.2012
comment
По возможности включайте пример в сам ответ. Обычный пользователь должен иметь возможность прочитать ваш ответ и получить от него некоторую пользу, не переходя по ссылке в блоге. Другими словами, ответ должен быть замкнутым. - person Robert Harvey; 23.10.2012
comment
Я запомню это. Спасибо :) - person Arcturus; 23.10.2012
comment
Также обратите внимание, что этому вопросу два года, и он уже получил высоко оцененный ответ, который был отмечен OP как принятый. Запоздавшие ответы более внимательно изучаются сообществом, чтобы оценить, действительно ли они добавляют дополнительную ценность OP. - person Robert Harvey; 23.10.2012
comment
@ Роберт Харви. Таким образом он сможет рекламировать свой блог ... - person gdoron is supporting Monica; 23.10.2012
comment
Слава Кодду, я прочитал конец страницы. - person Rafael Eyng; 24.11.2015
comment
@Arcturus прочитал статью, все еще одно из лучших объяснений нормализации. - person Olian04; 13.03.2017
comment
Чтобы быть более точным, это правило 3NF на самом деле является BCNF. 3NF несет дополнительное ограничение: если есть функциональная зависимость X - ›A, то X не является надлежащим подмножеством какого-либо ключа, но A является частью некоторого ключа. (Источник: Системы управления базами данных Рагху Рамакришнана и Герке). - person Dheeru Mundluru; 13.09.2017