Преобразование ER-модели в реляционную базу данных
В этой главе мы опишем, как базу данных, разработанную с использованием модели сущность-связь, можно реализовать в виде реляционной базы данных. В настоящее время широко практикуется следующий подход: сначала посредством ЕR-моделирования создается семантическая модель реляционной базы данных, затем она преобразуется с помощью описанных в данной главе методов во множество отношений, после чего для уточнения полученного в результате проекта используется нормализация.
Преобразование ЕR-модели в реляционную базу данных можно представить в виде следующей последовательности шагов.
Для каждой сильной сущности ЕR-модели создается базовое отношение, причем каждому простому атрибуту этой сущности соответствует столбец таблицы. Ключевой атрибут сущности становится первичным ключом отношения.
На рис. 2 представлены три сущности: Филиал, Клиент и Счет. Для каждой из них нужно создать отношение. В таблице Филиал будут следующие столбцы: Название_филиала, Адрес и Менеджер, причем первичным ключом будет Название_филиала. В таблице Счет будет два столбца, Номер_счета и Баланс, а первичным ключом будет Номер_счета.
Если ключ составной, то для каждой его части создается отдельный столбец, а затем этот набор столбцов объявляется первичным ключом отношения.
Для каждой слабой сущности создается отношение, состоящее из всех простых атрибутов этой сущности и дополнительных столбцов первичных ключей сущностей, от которых зависит ее существование.
На рис. 5 представлена слабая сущность Регистрация, имеющая один простой атрибут Дата_регистрации. Эта сущность участвует в связях с Клиент и Счет. Следовательно, нужно включить в отношение Регистрация столбцы Номер_счета и Номер_клиента, указывающие, к каким счету и клиенту относится регистрационная запись. Таким образом, каждый кортеж отношения Регистрация будет состоять из трех столбцов: Номер_счета, Номер_клиента, Дата_регистрации. Эти внешние ключи необходимы, так как, по определению, слабая сущность не может существовать независимо. Она должна иметь явные связи с теми сущностями, от которых зависит. В реляционной базе данных такие связи задаются с помощью внешних ключей. В нашем случае рассматриваемая сущность к тому же не имеет первичного ключа. В такой ситуации первичным ключом становится комбинация внешних ключей сущностей, от которых зависит эта слабая сущность. Таким образом, ключ отношения Регистрация — это составной ключ, включающий Номер_счета и Номер_клиента.
3. Когда две сущности участвуют в связи один-ко-многим (1-М), отношение, представляющее сущность с кардинальностью М, должно иметь столбец внешнего ключа, представляющий эту связь.
Между сущностями, которые мы рассматривали, было несколько связей типа 1-М. В частности, связь между Филиал и Счет (рис. 3) имеет тип 1-М, это означает, что в отношении Счет должен присутствовать в качестве внешнего ключа столбец Название_филиала.
Когда две сущности участвуют в связи один-к-одному (1-1), в отношение, представляющее одну из этих сущностей, необходимо включить столбец внешнего ключа.
Не следует помещать внешние ключи в оба отношения, так как это создает возможность для записи несогласованных данных.
Однако следует ответить на вопрос: в каком отношении лучше поместить столбец внешнего ключа для отражения связи 1—1. Согласно определению, сущность полностью участвует в связи, когда каждый ее экземпляр должен участвовать в этой связи. Итак, для представления связи 1-1 внешний ключ следует помещать в отношение, представляющее сущность, которая более близка к полному участию в связи.
Иногда встречаются связи 1-1, в которых обе сущности участвуют полностью. Если эти сущности не участвуют больше ни в каких иных связях, иногда можно объединить их в одно отношение. Следует отметить, что если внешний ключ представляет связь 1-1, дублирующие значения этого ключа должны быть запрещены.
Если две сущности участвуют в связи многие-ко-многим (М-М), необходимо создать отношение из внешних ключей двух отношений, представляющих сущности-участники.
Связь «имеет» на рис. 4 между Клиент и Счет имеет кардинальность М-М. Чтобы представить ее в реляционной модели, нужно отношение Владение счетами, состоящее из двух столбцов: Номер_клиента (ссылающегося на Клиент) и Номер_счета (ссылающегося на Счет). Первичный ключ данной таблицы — комбинация этих двух столбцов, а кортежи представляют пары значений, где номеру клиента ставится в соответствие номер счета, которым он владеет. Клиенту, имеющему три счета, в данной таблице будет соответствовать три кортежа с одним и тем же Номером_клиента. Аналогично, счет, у которого четыре владельца, будет представлен в таблице четырьмя кортежами с одним и тем же Номером_счета и различными Номерами_клиентов, владеющих этим счетом (табл. 1). Согласно таблице, клиент 12345 имеет три счета, а у счета 56789 — четыре владельца.
Отношение: Владение счетами | |
Номер_клиента | Номер_счета |
56789 ' | |
Таблица 1. Отношение, представляющее связь М-М
Если сущность имеет многозначный атрибут, для его представления следует создать отдельное отношение. Один столбец этого отношения будет внешним ключом к отношению, представляющему сущность, а второй будет представлять многозначный атрибут. Первичный ключ в данном случае — комбинация этих столбцов. Такое представление необходимо в силу требования атомарности данных в реляционной базе данных.
Предположим, что сущность Клиент имеет многозначный атрибут Номер_телефона, т.е. клиент может иметь несколько номеров телефонов. Невозможно включить столбец, представляющий этот атрибут, в отношение Клиент. Необходимо создать отдельное отношение Телефоны_клиентов со столбцами Номер_клиента (внешний ключ, ссылающийся на Клиент) и Номер_телефона; первичный ключ отношения будет состоять из этих двух столбцов. В этой таблице каждому телефонному номеру клиента соответствует отдельный кортеж. В табл. 2 у клиента 12345 три телефонных номера, а у клиента 67859 — один.
Отношение Телефоны_клиентов | |
Номер_клиента | Номер_телефона |
687-69449 | |
687-09382 | |
02-578-59483 | |
657-03938 |
Таблица 2. Реализация многозначного атрибута
Если многозначный атрибут является составным, то в представляющем его отношении должны быть отдельные столбцы для каждой составной части данного атрибута.