1.5 Четвертая нормальная форма
Чтобы база данных находилась в четвертой нормальной форме, необходимо, чтобы независимые элементы данных, между которыми существует связь типа многие-ко-многим, не хранились в одной таблице. Таблица команды не находится в четвертой нормальной форме, поскольку связи многие-ко-многим установлены между ее полем судно и полями с кодами членов команды.
Многие разработчики приложений баз данных игнорируют четвертую и пятую нормальные формы в своих программных продуктах, поскольку считают их весьма специфическими. Результатом этого зачастую является создание базы данных неправильной структуры, хотя это совсем не означает, что она не будет функционировать.
1.6 Пятая нормальная форма
Пятая нормальная форма требует обеспечения возможности точного восстановления исходной таблицы из таблиц, на которых она основана. Построение пятой нормальной формы требует удовлетворения требований третьей нормальной формы и, при наличии связей многие-ко-многим, соответствия правилам четвертой.
Таблица Рейсы очень похожа на таблицу Порты. Столбец прибытие из аналогичен столбцу Порт, а столбец Погрузка - столбцу Отправление. именно по этой причине можно переместить данные таблицы Рейсы в таблицу порты и удалить таблицу Рейсы. новая таблица порты показана в таблице 9 Значения столбца Прибытие для записей, внесенных в таблицу Порты из таблицы рейсы, не определены (не существуют), так как в таблице Рейсы были указаны только даты отравления.
Таблица 9 - Таблица “Порты”
Судно |
Рейс |
Порт |
Прибытие |
Отправление |
528 |
9203W |
HNL |
6/6/92 |
6/8/92 |
528 |
9203W |
OSA |
6/19/92 |
6/21/92 |
528 |
9204W |
PAP |
7/10/92 |
7/11/92 |
528 |
9204W |
HNL |
8/27/92 |
8/29/92 |
528 |
9203W |
OSA |
7/15/92 |
7/18/92 |
603 |
9203W |
INC |
6/25/92 |
6/28/92 |
531 |
9204W |
SYD |
8/28/92 |
9/2/92 |
528 |
9204W |
OSA |
9/30/92 |
10/2/92 |
528 |
9203W |
SFO |
|
5/31/92 |
603 |
9203W |
OAK |
|
6/5/92 |
531 |
9204W |
LAX |
|
6/20/92 |
528 |
9204W |
SFO |
|
6/20/92 |
Невозможно восстановить исходную таблицу из объединенных таблиц Рейсы и Порты, поскольку не сможете отличить строку отправления от других строк по значениям ее полей в таблице. Чтобы отличить строки отправлений, можно было бы использовать значения Null в поле Прибытие, однако значение Null должно быть зарезервированным для условия “данные недоступны". Необходимо устранить любые двусмысленности, которые могут привести к появлению значений Null, и преобразовать таблицу в пятую нормальную форму, добавив односимвольное поле Тип, определяющее прибытие или отправление. В показанной таблице 10 Порты коды Е и S представляют соответственно погрузку (Embarkation) и ожидаемое прибытие (Scheduled). Могут также использоваться коды M для заправки (Maintenance) и R - для обратного рейса (Return voyage).
Таблица 10 - Таблица “Порты”
Судно |
Рейс |
Порт |
Тип |
Прибытие |
Отправление |
528 |
9203W |
HNL |
S |
6/6/92 |
6/8/92 |
528 |
9203W |
OSA |
S |
6/19/92 |
6/21/92 |
528 |
9204W |
PAP |
S |
7/10/92 |
7/11/92 |
528 |
9204W |
HNL |
S |
8/27/92 |
8/29/92 |
528 |
9203W |
OSA |
S |
7/15/92 |
7/18/92 |
603 |
9203W |
INC |
S |
6/25/92 |
6/28/92 |
531 |
9204W |
SYD |
S |
8/28/92 |
9/2/92 |
528 |
9204W |
OSA |
S |
9/30/92 |
10/2/92 |
