4.3. Вторая нормальная форма.
Для проведения дальнейшей нормализации в теории реляционных баз данных вводится понятие ключа. Напомним, что:
Суперключ (superkey) – это атрибут или множество атрибутов, которое единственным образом идентифицирует кортеж данного отношения.
Потенциальный ключ – это суперключ, который не содержит подмножества, также являющегося суперключом данного отношения.
Первичный ключ – это потенциальный ключ, который выбран для уникальной идентификации кортежей внутри отношения.
Внешний ключ – это атрибут или множество атрибутов внутри отношения, которое соответствует потенциальному ключу некоторого (может быть, того же самого) отношения.
Для определения второй нормальной формы необходимо ввести концепцию функциональной зависимости. Это зависимость, связывающая атрибуты в одной таблице с единственным значением в другой таблице. Функциональную зависимость для таблиц А и В принято обозначать как А-В. Это понятие подводит "на один шаг" к родственной концепции объединения таблиц в отношения типа 1:1 или 1:М.
Теперь приведем определение второй нормальной формы.
Таблица представлена во второй нормальной форме (2НФ) тогда и только тогда, когда она представлена в 1НФ и каждый неключевой атрибут полностью определяется первичным ключом, то есть чтобы первичный ключ однозначно определял запись и не был избыточен. Те поля, которые зависят только от части первичного ключа, должны быть выделены в составе отдельных таблиц.
Примером приведения таблиц ко второй нормальной форме может служить следующее решение, позволяющее учитывать читателей, записанных в библиотеке, приведенное в табл. 4.4. Очевидно, что в качестве первичного ключа может выступать совокупность полей «№ читательского билета», «Серия паспорта» и «№ паспорта». Однако, поле «№ читательского билета» может самостоятельно выступать в качестве первичного ключа. В свою очередь совокупность полей «Серия паспорта» и «№ паспорта» также однозначно характеризуют читателя. Следовательно, первичный ключ «№ читательского билета», «Серия паспорта» и «№ паспорта» однозначно определяет запись таблицы «Читатели», но является избыточным. Значит необходимо выделить поля, которые зависят только от части первичного ключа «Серия паспорта» и «№ паспорта» необходимо выделить в отдельную таблицу. В итоге получим, что сведения о читателях библиотеки будут размещены в двух таблицах (табл. 4.5 и 4.6), которые связаны отношением 1:1.
Таблица 4.4.
Спецификация таблицы Readers (ЧИТАТЕЛИ).
№ п.п. |
Заглавие |
Имя поля |
Тип |
Длина |
Ключ |
|
Фамилия |
FamilyName |
CHAR |
30 |
|
|
Имя |
Name |
CHAR |
30 |
|
|
Отчество |
Patronymic |
CHAR |
30 |
|
|
№ читательского билета |
ReaderCardNumber |
INTEGER |
|
|
|
Серия паспорта |
Series |
CHAR |
2 |
|
|
№ паспорта |
Number |
INTEGER |
|
|
|
Дата рождения |
Birthday |
DATE |
|
|
|
Место рождения |
BirthPlace |
CHAR |
30 |
|
|
Пол |
Sex |
CHAR |
1 |
|
|
Место выдачи паспорта |
IssuePlace |
CHAR |
100 |
|
|
Дата выдачи паспорта |
IssueDate |
DATE |
|
|
|
Прописка |
Note |
BLOB |
|
|
|
Место основной работы |
Job |
CHAR |
60 |
|
|
Должность |
Post |
CHAR |
30 |
|
|
Примечания |
Note |
BLOB |
|
|
Таблица 4.5.
Спецификация таблицы Readers (ЧИТАТЕЛИ).
№ п.п. |
Заглавие |
Имя поля |
Тип |
Длина |
Ключ |
|
Фамилия |
FamilyName |
CHAR |
30 |
|
|
Имя |
Name |
CHAR |
30 |
|
|
Отчество |
Patronymic |
CHAR |
30 |
|
|
№ читательского билета |
ReaderCardNumber |
INTEGER |
|
P |
|
Серия паспорта |
Series |
CHAR |
2 |
F |
|
№ папорта |
Number |
INTEGER |
|
F |
|
Место основной работы |
Job |
CHAR |
60 |
|
|
Должность |
Post |
CHAR |
30 |
|
|
Примечания |
Note |
BLOB |
|
|
Таблица 4.6.
Спецификация таблицы PasportData (ПАСПОРТНЫЕ ДАННЫЕ).
№ п.п. |
Заглавие |
Имя поля |
Тип |
Длина |
Ключ |
|
Серия паспорта |
Series |
CHAR |
2 |
P |
|
№ папорта |
Number |
INTEGER |
|
P |
|
Дата рождения |
Birthday |
DATE |
|
|
|
Место рождения |
BirthPlace |
CHAR |
30 |
|
|
Пол |
Sex |
CHAR |
1 |
|
|
Место выдачи паспорта |
IssuePlace |
CHAR |
100 |
|
|
Дата выдачи паспорта |
IssueDate |
DATE |
|
|
|
Прописка |
Note |
BLOB |
|
|