Для установления связи между двумя отношениями одно из них должно иметь уникальный ключ, а другое - атрибут связи, в котором будут храниться значения ключа.
Итак, первым делом задаем в отношении Т1 уникальный ключ по атрибуту NAME. Этап 4 означает, что все записи окажутся отсортированными по выбранному полю, что делает их пригодными для быстрого (двоичного) поиска. С каждой записью оказывается связанным некоторое ключевое выражение - например, номер записи в отношении Т1. Это ключевое выражение мы и будем хранить в атрибуте связи отношения Т0.
T1 T0
NAME
NAME
I1
I2
PHONE
Иванов
А
Б
Петров
В
Г
Сидоров
Д
Е
М
В
Рис. 27.7. Установление связи между таблицами
Теперь данная БД нормализована: в ней нет дублирующей информации. Обратите внимание, что для удобства атрибут связи и атрибут с уникальными значениями имеют одинаковые имена (Рис. 23.7).
Следует заметить, что декомпозиция должна быть оправдана не только с точки зрения устранения дублирования, но и с точки зрения минимизации размера БД. Так, в рассматриваемом примере значения атрибутов I1 или I2 отношения T0 могут повторяться, но их вынесение в отдельные отношения было бы нерациональным решением. Давайте посчитаем: в отношении Т0 каждое из этих полей занимает 1 байт. Вынос их в отдельные отношения приведет к тому, что ключевое выражение будет иметь длину также 1 байт (число букв, для русского языка равное 32, вполне умещается в одном байте). Поле связи, соответственно, тоже будет иметь размер 1 байт. В итоге не имеем никакого выигрыша в размере отношения Т0 и сверх этого получаем еще два отношения. В данном случае подобная оптимизация не оправдана.
И, наконец, последний 5-й этап создания БД - установление связей между отношениями. Прежде всего, надо выделить главное отношение. Главным отношением будет, как правило, то, которое содержит поля связи. В данном случае это Т0. Установим следующее правило: при переходе с записи на запись в Т0 берется ключевое значение из поля Т0àNAME и по нему выполняется двоичный поиск в отношении Т1. Тогда всегда в отношении Т1 текущей будет запись с фамилией, соответствующей текущему номеру телефона в отношении Т0.
БЫЛО:
PRODUCT
FIRMA
Привод
ОАО «Электроприбор»
Задвижка
ООО «Арматура»
Задвижка
ОАО «Электроприбор»
Привод
ООО «Арматура»
СТАЛО:
PRODUCT
PRODUCT
FIRMA
FIRMA
Привод
ОАО "Электроприбор"
Задвижка
ООО "Арматура"
Рис. 27.8. Нормализация связи «многий – ко – многим»
Интересный вопрос возникает при удалении записи из нормализованного отношения, не являющего главным. Скажем, оказалось, что всем абонентам по фамилии "Петров" сняли телефоны. Тогда можно удалить соответствующую запись из отношения Т1. При этом правильно спроектированная БД выполнит каскадное удаление: автоматически удалит все записи в Т0, атрибут связи которых ссылался на запись "Петров" в отношении Т1. Каскадное удаление гарантирует отсутствие в главном отношении "потерянных" записей, которые ссылаются "в никуда".
Существует три вида связей между атрибутами двух отношений. Они называются "один-к-одному", "один-ко-многим" и "многий-ко-многим".
Связь "один-к-одному":между атрибутами А и В существует связь "один к одному", если каждому значению атрибута А соответствует одно и только одно значение атрибута В. Обратное может быть неверно. Именно такой вид связи установлен между атрибутами "Имя абонента" (А) и "Номер телефона" в ненормализованной базе данных (В): каждому абоненту соответствует один и только один телефонный номер.
В случае связи "один-к-одному" нормализация сводится к устранению возможного дублирования информации в атрибуте А, поскольку атрибут В по определению избыточной информации не содержит.
Связь "один-ко-многим": одному значению атрибута А соответствует одно или несколько значений атрибута В. Это самый распространенный вид связи. В данном примере, если рассматривать Т1 как главное отношение, атрибут T1àNAME (A) связан связью "один-ко-многим" с атрибутом T0àPHONE (B), поскольку абоненты с разными номерами телефонов могут иметь одинаковые фамилии (Рис. 23.9). Нормализация такой связи заключается в выделении в отдельное отношение атрибута А.
Рис. 27.9 Связь "один-ко-многим".
Связь "многий-ко-многим": нескольким значениям атрибута А соответствует несколько значений атрибута В (Рис. 23.10). Пример такой связи - уже рассматривавшаяся выше база товаров и их покупателей. Один покупатель может покупать несколько разных товаров, а один и тот же товар может продаваться нескольким разным покупателям. Для нормализацииБД разбивается на три отношения: нормализованное А, нормализованное В и отношение связи.