
Рис. 2.5. Этапы нормализации данных в рамках реляционной модели
Пример ненормализованных данных представлен в табл. 2.10. в виде фрагмента расписания движения паромов.
Таблица 2.10 РАСПИСАНИЕ
Паром | Название | Маршрут | Погрузка | Из | Прибытие | Порт | Отплытие | Прибытие | Порт | Отплытие |
528 | Japan Bear | 01033 | 31.05.01 | SFO | 06.06.01 | HNL | 08.06.01 | 15.07.01 | OSA | 18.07.01 |
603 | Korea Bear | 01033 | 05.06.01 | OAK | 19.06.01 | OSA | 21.06.01 | 25.06.01 | INC | 28.06.01 |
531 | Chine Bear | 01043 | 20.06.01 | LAX | 10.07.01 | PAP | 11.07.01 | 28.08.01 | SYD | 02.09.01 |
528 | Japan Bear | 01043 | 20.08.01 | SFO | 27.08.01 | HNL | 29.08.01 | 30.09.01 | OSA | 02.10.01 |
Поскольку паромы останавливаются в нескольких пунктах, столбцы "Прибытие", "Порт" и "Отплытие" заданы для каждой остановки в путешествии. Такой тип структуры данных допускается, например, в языке COBOL, в котором повторяющаяся группа ("Прибытие", "Порт" и "Отплытие") может встречаться сколько угодно раз, однако это не относится к реляционной модели данных. Информация в показанной таблице не приведена к первой нормальной форме, т. к. она содержит повторяющиеся группы. Таблицу РАСПИСАНИЕ необходимо разделить (разбить) на две новые таблицы МАРШРУТЫ ПАРОМОВ и ПУНКТЫ (табл. 2.11, 2.12).
Теперь необходимо установить связь между новыми таблицами МАРШРУТЫ ПАРОМОВ и ПУНКТЫ, чтобы обозначить отношения между данными. Поскольку маршруты включают для каждого судна год, номер маршрута и направление (01043 соответствует четвертому рейсу за 2001 год в западном направлении), то для связи таблиц необходимы поля "Паром" и "Маршрут". Поля "Название" и "Маршрут" не являются по отдельности однозначным идентификатором, т. к. у судна может быть несколько маршрутов за год, а номера маршрутов могут повторяться для других судов. Для приведения реляционной модели к первой нормальной форме требуется модифицировать таблицу ПУНКТЫ, изменив порядок столбцов и расположив их по степени значимости. Столбцы, используемые для установления связей, обычно указываются первыми и в той очередности, в которой они используются в первичном составном ключе, если ключ включает несколько полей.
Затем требуется задать ключевые поля, однозначно определяющие запись в таблице ПУНКТЫ. Остальные таблицы могут зависеть от таблицы ПУНКТЫ, поэтому первичный ключ в ней необходим. Ясно, что следует включить в первичный ключ поля "Паром" и "Маршрут", т. к. эти столбцы определяют отношение с таблицей "Паромы". Для создания уникального ключа необходимо добавить также поле "Порт" (столбцы "Паром" и "Маршрут" могут иметь повторяющиеся значения). Составной ключ, включающий поля "Паром", "Маршрут" и "Порт", однозначно определяет обе остановки в пункте (табл. 2.13).
Таблица 2.13 Модифицированная таблица ПУНКТЫ
Паром | Маршрут | Порт | Прибытие | Отплытие |
528 | 01033 | HNL | 06.06.01 | 08.06.01 |
603 | 01033 | OSA | 19.06.01 | 21.06.01 |
531 | 01043 | PAP | 10.07.01 | 11.07.01 |
528 | 01043 | HNL | 27.08.01 | 29.08.01 |
528 | 01033 | OSA | 15.07.01 | 18.07.01 |
603 | 01033 | INC | 25.06.01 | 28.06.01 |
531 | 01043 | SYD | 28.08.01 | 02.09.01 |
528 | 01043 | OSA | 30.09.01 | 02.10.01 |
Для второй нормальной формы (2НФ) требуется, чтобы данные во всех неключевых столбцах полностью зависели от первичного ключа и каждого элемента (столбца) первичного ключа, если ключ является составным. Под полной зависимостью понимается то, что значение в каждом не ключевом столбце однозначно определяется значением первичного ключа. Если одно из полей не зависит от величины первичного ключа, то необходимо включить в ключ дополнительные столбцы.
Перед проверкой на соответствие второй нормальной форме таблица должна быть приведена к первой нормальной форме. Вторая нормальная форма позволяет удалить большую часть повторяющихся данных, которые часто остаются после первого этапа нормализации.
В таблице МАРШРУТЫ ПАРОМОВ требуется задать составной первичный ключ, включающий поля "Паром" и "Маршрут". Однако только этих полей недостаточно: поля "Паром" и "Название парома" не зависят от значения всего первичного ключа, т. к. они не определяются полем "Маршрут". Кроме того, название судна указывается для каждого маршрута, например Japan Bear встречается дважды. Отсутствие зависимости нарушает требования второй нормальной формы, поэтому необходимо разбить таблицу МАРШРУТЫ ПАРОМОВ на таблицы ПАРОМЫ и МАРШРУТЫ. Одной строке в таблице ПАРОМЫ соответствует один паром, а одной строке в таблице МАРШРУТЫ — один рейс, выполняемый паромом. Как и в случае с таблицей ПУНКТЫ, для связывания маршрутов и паромов необходим уникальный ключ, поэтому в таблицу МАРШРУТЫ добавляется столбец номера судна (табл. 2.14, 2.15).
Для третьей нормальной формы (3НФ) требуется, чтобы все неключевые столбцы таблицы зависели от первичного ключа таблицы, но были независимы друг от друга. Для этого требуется, чтобы таблицы были приведены к первой и второй нормальной форме.
Таблицы ПАРОМЫ и МАРШРУТЫ уже приведены к третьей нормальной форме, потому что они не содержат повторяющихся данных и данные неключевых полей зависят от значения поля первичного ключа. Неключевые поля "Прибытие" и "Отплытие" таблицы ПУНКТЫ зависят от составного ключа (поля "Паром", "Маршрут" и "Порт"), но не зависят друг от друга. Следовательно, таблица ПУНКТЫ приведена к первой, второй и третьей нормальной форме. Дата отплытия не зависит от даты прибытия, т. к. дата отплытия определяется также другими обстоятельствами: наличием товаров на складе, загруженностью контейнерных кранов, погодой.
Чтобы показать приведение к третьей нормальной форме, предположим, что необходимо занести в модель информацию об офицерах — капитане, боцмане и т. д., создав таблицу КОМАНДА. На первый взгляд может показаться, что можно просто добавить их личные номера — первичный ключ таблицы ОФИЦЕРЫ — в таблицу ПАРОМЫ (табл. 2.16).
Таблица 2.16 КОМАНДА (исходная ненормализованная)
Паром | Название | Капитан | Боцман | Первый помощник |
528 | Japan Bear | 01023 | 01155 | 01367 |
603 | Korea Bear | 00955 | 01203 | 00823 |
531 | Chine Bear | 00721 | 00912 | 01251 |
В этом случае таблица КОМАНДА не будет приведена к третьей нормальной форме, потому что ни один офицер не обязан все время служить на одном пароме. Такой тип связи называется транзитивным. Дипломы капитана, боцмана и первого помощника позволяют служить на любом судне, на которое распространяется действие диплома. При необходимости любой из офицеров может быть переведен на другое судно, либо он может находиться на борту только на участке пути.
Один из способов устранения транзитивной зависимости заключается в добавлении столбца личных номеров в таблицу ПАРОМЫ. Этот метод не обеспечивает полного решения проблемы, т. к. судно может войти в порт с одним экипажем, а выйти из него с другим. Кроме того, придется указать членов экипажа, которые находятся на судне во время стоянки в порту.
В модифицированной таблице КОМАНДА представлено возможное решение. Повторяющиеся значения в полях "Порт" (пункт отплытия) и "В" (пункт прибытия) определяют информацию о членах команды, ответственных за обеспечение стоянки в некотором пункте. Модифицированная таблица КОМАНДА является реляционной, т. к. все ее поля соответствуют первичным ключам или частям первичных ключей в базовых таблицах ПАРОМЫ, МАРШРУТЫ, ПУНКТЫ и ОФИЦЕРЫ (табл. 2.17).
Таблица 2.16 КОМАНДА (фрагмент нормализованной таблицы)
Паром | Маршрут | Порт | В | Капитан | Боцман | Первый помощник |
528 | 01033 | SFO | HNL | 01023 | 01155 | 01367 |
528 | 01033 | HNL | HNL | 01023 | 01155 | 01367 |
528 | 01033 | HNL | OSA | 01023 | 01155 | 01367 |
528 | 01033 | OSA | OSA | 01023 | 01155 | 01367 |
528 | 01033 | OSA | INC | 01023 | 01155 | 01367 |
Таким образом, таблицы ПАРОМЫ, МАРШРУТЫ, ПУНКТЫ, КОМАНДА являются двумерными, не содержат повторяющейся информации во всех столбцах, исключая ключевые, и приведены к первой, второй и третьей нормальным формам.
|
Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 |


