Рис. 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