В третьей нормальной форме столбцы, не являющиеся ключевыми, зависят от первичного ключа таблицы и не зависят от всех остальных столбцов. Должна быть возможность изменять значения любого поля (не входящего в первичный ключ) без воздействия на данные других полей. Прежде чем перейти к третьей нормальной форме, необходимо привести свои данные к первой, а затем - ко второй.
Таблицы суда и Рейсы уже представлены в третьей нормальной форме, поскольку они содержат повторяющихся групп столбцов и существует зависимость неключевых столбцов этих таблиц от ключевых. В таблице Порты нет повторяющихся групп полей, а неключевые поля Прибытие и Отправление зависят от составного ключа (Судно + Рейс + Порт) и не зависят друг от друга. (Дата прибытия никак не влияет на дату отправления, поскольку интервал между ними определяется временем погрузки товаров на судно, доступностью стоянок, погрузочных кранов, а также погодными условиями) Таким образом, таблица Порты удовлетворяет требованиям первой, второй и третьей нормальных форм.
Например, необходимо ввести в базу данных еще и служащих, членов команд кораблей (капитанов, инженеров и т.п.). Для этого необходимо добавить в таблицу Суда коды служащих, являющиеся первичными ключами таблицы Служащие, показанные в таблице 1.7
Таблица 1.7 - Таблица с транзитивным отношением между судами и служащими команды.
Судно | Название | Капитан | Старший помощник | Первый помощник |
528 | Japan Bear | 01023 | 01155 | 01367 |
603 | Korea Bear | 00955 | 01203 | 00823 |
531 | China Bear | 00721 | 00912 | 01251 |
Такая таблица нарушает одно из правил третьей нормальной формы, поскольку никто из назначенных на какое-либо судно служащих от этого судна не зависит непосредственно (т.е. добавлямое неключевое поле не зависит от первичного ключа). Капитан, его помощник или старший помощник могут выполнять свои обязанности на любом судне. Каждого офицера можно в случае необходимости перевести на другой корабль или оставить на суше до следующего рейса.
Можно попробовать добавить столбец с номерами служащих в таблицу Рейсы. Но и это не решит всех проблем, так как судно может прибыть в порт с одним командным составом, а отбыть с совершенно другим. Кроме этого, возникает необходимость определить членов команды, остающихся на судне во время его стоянки в порту.
Все эти вопросы решаются с помощью таблицы Команды, приведенной в таблице 1.8 повторяющиеся значения полей Порт (порт отправления) и Отправление в (порт прибытия) создают записи для тех членов команды, которые несут ответственность за судно во время его пребывания в порту. Таблица Команды относится к категории связующих таблиц, поскольку все поля связаны с первичными ключами основных таблиц (Суда, Рейсы, Порты и Служащие) или являются частью этих таблиц.
Таблица 1.8 - Таблица “Команды”
Судно | Рейс | Порт | Отправление в | Капитан | Старший помощник | Первый помощник |
528 | 9203W | SFO | HNL | 01023 | 01156 | 01367 |
528 | 9203W | HNL | HNL | 01023 | 01156 | 01367 |
528 | 9203W | HNL | OSA | 01023 | 01156 | 01367 |
528 | 9203W | OSA | OSA | 01023 | 01156 | 01367 |
528 | 9203W | OSA | INC | 01023 | 01156 | 01367 |
Теперь все таблицы являются плоскими, не содержат повторяющейся информации, за исключением данных, используемых в ключах. Все эти таблицы удовлетворяют требованиям первой, второй и третьей нормальной форм.
Чтобы база данных находилась в четвертой нормальной форме, необходимо, чтобы независимые элементы данных, между которыми существует связь типа многие-ко-многим, не хранились в одной таблице. Таблица команды не находится в четвертой нормальной форме, поскольку связи многие-ко-многим установлены между ее полем судно и полями с кодами членов команды.
Многие разработчики приложений баз данных игнорируют четвертую и пятую нормальные формы в своих программных продуктах, поскольку считают их весьма специфическими. Результатом этого зачастую является создание базы данных неправильной структуры, хотя это совсем не означает, что она не будет функционировать.
Пятая нормальная форма требует обеспечения возможности точного восстановления исходной таблицы из таблиц, на которых она основана. Построение пятой нормальной формы требует удовлетворения требований третьей нормальной формы и, при наличии связей многие-ко-многим, соответствия правилам четвертой.
Таблица Рейсы очень похожа на таблицу Порты. Столбец прибытие из аналогичен столбцу Порт, а столбец Погрузка - столбцу Отправление. именно по этой причине можно переместить данные таблицы Рейсы в таблицу порты и удалить таблицу Рейсы. новая таблица порты показана в таблице 1.9 Значения столбца Прибытие для записей, внесенных в таблицу Порты из таблицы рейсы, не определены (не существуют), так как в таблице Рейсы были указаны только даты отравления.
Таблица 1.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, и преобразовать таблицу в пятую нормальную форму, добавив односимвольное поле Тип, определяющее прибытие или отправление. В показанной таблице 1.10 Порты коды Е и S представляют соответственно погрузку (Embarkation) и ожидаемое прибытие (Scheduled). Могут также использоваться коды M для заправки (Maintenance) и R- для обратного рейса (Returnvoyage).
Таблица 1.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 |
528 | 9203W | SFO | E | 5/31/92 | |
603 | 9203W | OAK | E | 6/5/92 | |
531 | 9204W | LAX | E | 6/20/92 | |
528 | 9204W | SFO | E | 6/20/92 |
R1 - список абитуриентов, сдававших репетиционные вступительные экзамены;
R2 - список абитуриентов, сдававших вступительные экзамены на общих основаниях;
R3 - список абитуриентов, принятых в институт.
Необходимо написать ответ на запрос в виде формулы реляционной алгебры. Запрос: “Список абитуриентов, которые поступали два раза и поступили в вуз".
Таблица 2.1 - Отношение R1
Обозначение записи | ФИО абитуриента | Номер и серия паспорта | № Школы |
a | Жилкова О.А. | 32 05 4237 | № 31 |
b | Богач Д.О. | 34 07 4385 | № 42 |
с | Конопелько О.П. | 37 08 4282 | № 56 |
d | Кочкина Т.В. | 38 02 3458 | № 52 |
e | Докучаев Ю.А. | 58 02 3718 | № 62 |
f | Богданова Ю.В. | 38 72 4290 | № 48 |
g | Сидорова С.И. | 39 52 4870 | № 45 |
h | Сидоров А.А. | 38 59 3295 | № 46 |
l | Тарабрина Л.В. | 40 58 2598 | № 49 |
Таблица 2.2 - Отношение R2
Обозначение записи | ФИО абитуриента | Номер и серия паспорта | № Школы |
a | Жилкова О.А. | 32 05 4237 | № 31 |
b | Богач Д.О. | 34 07 4385 | № 42 |
d | Кочкина Т.В. | 38 02 3458 | № 52 |
h | Сидоров А.А. | 38 59 3295 | № 46 |
m | Тарабрин В.В. | 35 92 4058 | №48 |
n | Голоушкина В.А. | 38 92 4259 | № 52 |
o | Токарева М.А. | 39 98 4085 | № 46 |
p | Круглова Т.Ю. | 32 58 3498 | № 47 |
Таблица 2.3 - Отношение R3
Обозначение записи | ФИО абитуриента | Номер и серия паспорта | № Школы |
a | Жилкова О.А. | 32 05 4237 | № 31 |
b | Богач Д.О. | 34 07 4385 | № 42 |
d | Кочкина Т.В. | 38 02 3458 | № 52 |
h | Сидоров А.А. | 38 59 3295 | № 46 |
p | Круглова Т.Ю. | 32 58 3498 | № 47 |
с | Конопелько О.П. | 37 08 4282 | № 56 |
Операция реляционной алгебры - “пересечение".
R1 (a,b,c,d,e,f,g,h,l)
R2 (a,b,d,h,m,n,o,p) =R3 (a,b,d,h)