Получить: набор таблиц (отношений) следующего вида
Таблица (Ключ, Атрибут1, Атрибут2, …, АтрибутN)
Первичным ключом (primary key), как и в ER-модели, называется атрибут или группа атрибутов, однозначно идентифицирующих объект. Первичные ключи будем подчеркивать.
Имена атрибутов в масштабе ER-модели удобно делать уникальными, тогда при построении реляционной модели их (почти никогда) не придется переименовывать.
Внешним ключом (foreign key) называют ссылку на родительский объект. Обычно внешние ключи появляются в таблицах в результате преобразования связей. Будем выделять внешние ключи курсивом.
Для краткости в некоторых примерах пропущены несущественные неключевые атрибуты.
I. Преобразование сущностей
1. Преобразование обычной сущности
Обычная сущность преобразуется в отдельную таблицу, столбцами таблицы будут все атрибуты сущности:
Сущность (Ключ, Атрибут1, Атрибут2)
2. Преобразование слабой сущности
Слабая сущность преобразуется в отдельную таблицу, столбцами таблицы будут все атрибуты сущности плюс ключевые атрибуты всех сильных сущностей, с помощью которых данная слабая сущность идентифицируется.
Ключевые поля всех сильных сущностей таблиц войдут в первичный ключ слабой сущности.
Для слабой сущности они будут являться внешними ключами.
Сущность1 (Ключ1, Ключ2, Атрибут1, Атрибут2)
3. Преобразование подтипов сущностей.
1 способ. Создается одна таблица, в которую помещают все атрибуты. Для того чтобы указать, к какому подтипу относится объект, приходится вводить дополнительное поле-признак.
Недостатком этого способа является то, что в таблице остается много незаполненных полей: для объекта подтипа 1 атрибуты 4 и 5, а для объекта подтипа 2 – атрибуты 2 и 3 останутся пустыми.
2 способ. Создается отдельная таблица для каждого подтипа. В нее включаются все атрибуты этого подтипа и все атрибуты надтипа.
Подтип1 (Ключ, Атрибут1, Атрибут2, Атрибут3)
Подтип2 (Ключ, Атрибут1, Атрибут4, Атрибут5)
Недостатком этого подхода является то, что подтипы теперь никак не связаны друг с другом.
3 способ. Создается одна таблица для надтипа и по одной таблице для каждого подтипа, в которую включаются ключевые поля надтипа:
Сущность1 (Ключ, Атрибут1)
Подтип1 (Ключ, Атрибут2, Атрибут3)
Подтип2 (Ключ, Атрибут4, Атрибут5)
Недостатком этого подхода является то, что информация о каждом объекте теперь распределена по двум таблицам.
II. Преобразование связей
Для связей-двойных ромбов ничего делать не нужно, вся информация уже хранится в таблице слабой сущности.
1. Связь М:М
По правилам преобразования обычной сущности, как мы видели выше, для каждой сущности создается отдельная таблица, содержащая все её атрибуты:
Сущность1 (Ключ1, Атрибут1, Атрибут2)
Сущность2 (Ключ2, Атрибут3, Атрибут4)
Для связи создается отдельная таблица, содержащая ключевые поля каждой сущности, участвующей в связи, и собственные атрибуты связи, если таковые имеются. В названии обычно отражают, какие именно сущности связываются, или называют новую таблицу именем связи.
Сущ1Сущ2 (Ключ1, Ключ2, Атрибут5)
2. Связь 1:М
1 способ. Точно так же, как и в случае М:М, создаются отдельные таблицы для сущностей и отдельная таблица для связи, содержащая ключевые поля каждой сущности, участвующей в связи. Первичным ключом будет ключ второй сущности.
Сущность1 (Ключ1,Атрибут1, Атрибут2)
Сущность2 (Ключ2,Атрибут3, Атрибут4)
Сущ1Сущ2 (Ключ1, Ключ2)
Этот способ предпочтительнее использовать в том случае, если связь не является «ровно к одному», то есть не все экземпляры сущностей участвуют в связи.
2 способ. Новая таблица для связи не создается, а в таблицу дочерней сущности добавляют ключевые поля родительской сущности (в первичный ключ дочерней сущности они входить не будут!). Ключевые поля родительской сущности представляют собой внешний ключ для дочерней сущности.
Сущность1 (Ключ1,Атрибут1, Атрибут2)
Сущность2 (Ключ2, Атрибут3, Атрибут4, Ключ1)
Этот способ предпочтительнее использовать в том случае, если связь является связью «ровно к одному» в сторону родительской сущности, то есть все экземпляры дочерней сущности участвуют в связи. В этом случае поле внешнего ключа никогда не будет пустым.
3. Связь 1:1
1 способ. Точно так же, как и в случае М:М, создаются отдельные таблицы для сущностей и отдельная таблица для связи, содержащая ключевые поля каждой сущности, участвующей в связи.
Первичным ключом этой таблицы будет ключ любой сущности.
Сущность1 (Ключ1,Атрибут1, Атрибут2)
Сущность2 (Ключ2,Атрибут3, Атрибут4)
Сущ1Сущ2 (Ключ1, Ключ2)илиСущ1Сущ2 (Ключ1, Ключ2)
Этот способ предпочтительнее использовать в том случае, если связь не является связью «ровно к одному», то есть не все экземпляры сущностей участвуют в связи.
2 способ. Точно так же, как и во 2 случае 1:М, новая таблица для связи не создается, а в таблицу одной из сущностей (будем считать ее дочерней) добавляют ключевые поля другой сущности (будем считать ее родительской).
Сущность1 (Ключ1,Атрибут1, Атрибут2)
Сущность2 (Ключ2, Атрибут3, Атрибут4, Ключ1)
Если связь не является связью «ровно к одному» по отношению к родительской таблице, то есть не все экземпляры дочерней сущности участвуют в связи, поле внешнего ключа в некоторых записях может быть пустым.
3 способ. Две таблицы для сущностей, связанных соотношением 1:1, объединяются в одну. Ключом новой таблицы может быть комбинация ключей обеих таблиц. Если хотя бы в одном направлении связь «ровно к одному», то ключ этой сущности можно считать ключом объединенной таблицы.
Сущ1Сущ2(Ключ1, Атрибут1, Ключ2, Атрибут2)
или, возможно, Сущ1Сущ2(Ключ1, Атрибут1, Ключ2, Атрибут2),
или Сущ1Сущ2(Ключ1, Атрибут1, Ключ2, Атрибут2).
Примечание 1:
Для связи сущности с самой собой применяются те же правила, но так как одна и та же сущность участвует в связи дважды, ключевые поля должны войти в одну и ту же таблицу два раза. Поэтому приходится переименовывать один из ключей.
Рассмотрим связь 1:M, способ 2. Переименован внешний ключ.
Для связей с арностью более 2 обычно применяется тот же способ, что и для бинарной связи M:M – создается новая таблица, содержащая ключевые поля всех связанных таблиц.
Сущ1Сущ2Сущ3 (Ключ1, Ключ2, Ключ3)
Пример реляционной модели: Контора «Рога и копыта»
Таблицы удобнее называть существительными во множественном числе.
В модель добавлены дополнительные неключевые атрибуты для того, чтобы задача была более интересной.
Ном_сотр появился в результате преобразования связи М:1 «Выписан», в первичный ключ он не входит, Ном_пред появился в результате преобразования связи 1:М «Заключает», в первичный ключ он не входит.
Эта таблица появилась в результате преобразования бинарной связи М:М «Состав счета», её первичный ключ состоит из ключевых полей обеих сущностей.
Пример реляционной модели: «Музыканты»
Музыканты (НомМуз, ИмяМуз, ДатаРожд, СтрРожд)
Эта таблица не имеет внешних ключей.
Сочинения (НомСоч, НазСоч, ДатаСоч, НомМуз)
Столбец НомМуз является внешним ключом, появился в результате преобразования связи 1:М «Композитор» и содержит номера музыкантов- композиторов.
Исполнители (НомИсп, Инструмент, Оценка, НомМуз)
Столбец НомМуз является внешним ключом, появился в результате преобразования связи 1:М «Является» с сущностью «Музыканты».
Ансамбли (НомАнс, НазАнс, СтрАнс, НомМуз)
Столбец НомМуз является внешним ключом, появился в результате преобразования связи 1:М «Руководитель».
УчАнс(НомАнс, НомИсп)
Эта таблица появилась в результате преобразования бинарной связи М:М «Участники», её первичный ключ состоит из ключевых полей обеих связанных сущностей.
Исполнения (НомМуз, НомАнс, НомСоч, ДатаИсп, СтрИсп, ГорИсп)
Поскольку сущность «Исполнения» является слабой сущностью, в состав её первичного ключа попали все первичные ключи сильных сущностей, от которых она зависит. По отдельности каждый из них является ещё и внешним ключом.