Ответ 1
1NF - самая простая из нормальных форм - каждая ячейка в таблице должна содержать только одну часть информации, и не может быть повторяющихся строк.
2NF и 3NF - все зависит от того, зависит ли от первичного ключа. Напомним, что первичный ключ может состоять из нескольких столбцов. Как сказал Крис в своем ответе:
Данные зависят от ключа [1NF], всего ключа [2NF] и ничего, кроме ключа [3NF] (так что помогите мне Codd).
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 является ключом ENTIRE.
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. Поэтому каждая дополнительная нормальная форма требует всего, что имели более низкие нормальные формы, плюс дополнительные условия, которые должны выполняться.