- •Новосибирская государственная академия экономики и управления
- •«Базы данных»
- •Преобразование объектных множеств и атрибутов
- •2. Преобразование моделей без ключей
- •3. Преобразование конкретизации и обобщений объектных множеств
- •4. Преобразование отношений
- •5. Преобразование составных объектных множеств
- •6. Преобразование рекурсивных отношений
- •7. Примеры преобразования: Консультационная Служба
- •8. Сопоставление концептуального и реляционного
3. Преобразование конкретизации и обобщений объектных множеств
Теперь рассмотрим рис. 3. Объектное множество PERSON легко преобразуется:
PERSON (SS#, NAME, ADDRESS)
Но что делать с объектом MARRIED-PERSON (ЖЕНАТЫЙ-ЧЕЛОВЕК)? Поскольку он является подобъектом объекта PERSON, он наследует атрибуты объекта PERSON. Кроме того, у него есть свои собственные атрибуты. Следовательно, мы выводим такую реляционную таблицу:
MARRIED-PERSON (SS#, NAME, ADDRESS, SPOUSE). Внешний ключ: SS# ссылается на PERSON
Рис. 3. Конкретизация объектного множества PERSON
Таким образом, конкретизация объектного множества будет иметь все атрибуты объектного множества, которое оно конкретизирует, плюс свои собственные атрибуты. Важно отметить, что ключ SS# таблицы конкретизации (MARRIED-PERSON в нашем примере) также является внешним ключом, указывающим на таблицу обобщения (в нашем случае, PERSON). Это так, поскольку каждый элемент конкретизированного множества должен лежать также в обобщающем множестве. Следовательно, NAME и ADDRESS в реляционной таблице MARRIED-PERSON содержат повторяющуюся информацию. Для того чтобы избежать такой избыточности данных, мы просто удалим из реляционной таблицы конкретизации все повторяющиеся не ключевые атрибуты. В конце концов наша реляционная таблица MARRIED-PERSON будет выглядеть следующим образом:
MARRIED-PERSON (SS#, SPOUSE)
Внешний ключ: SS# ссылается на PERSON.
4. Преобразование отношений
Отношение преобразуется одним из трех способов в зависимости от его мощности. Мы рассмотрим отдельно отношения один - к - одному, один - ко - многим и много - ко - многим.
Отношения один – к - одному. Рассмотрим пример банка. Отношение HAS-CHKG-ACCOUNT (ИМЕЕТ ТЕКУЩИЙ СЧЕТ), представленное на рис. 4, имеет мощность один – к - одному. Это означает» что клиент имеет не более одного текущего счета и каждым текущим счетом пользуется только один клиент.
Рис. 4. Мощности отношений модели банка
Если мы решим, что ключами являются CUSTOMER-# (№-КЛИЕНТА) для CUSTOMER (КЛИЕНТ) и CH-ACCOUNT-# (НОМЕР-ТЕКУЩЕГО-СЧЕТА) для CHECKING-ACCOUNT (ТЕКУЩИЙ-СЧЕТ), то мы получим две реляционные таблицы, каждая из которых состоит из одного столбца:
CUSTOMER (CUSTOMER-#)
CHECKING-ACCOUNT (CH-ACCOUNT-#)
Для того чтобы показать связь между этими двумя таблицами, мы должны включить CH-ACCOUNT-# в таблицу CUSTOMER и CUSTOMER-# в таблицу CHECKING-ACCOUNT. Обратите внимание, что каждый из этих столбцов будет внешним ключом, указывающим на другую таблицу:
CUSTOMER (CUSTOMER-#, CH-ACCOUNT-#)
Внешний ключ: CH-ACCOUNT-# ссылается на CHECKING-ACCOUNT.
CHECKING-ACCOUNT (CH-ACCOUNT-#, CUSTOMER-#)
Внешний ключ: CUSTOMER-# ссылается на CUSTOMER.
Очевидно, что при таком решении данные дублируются, так как необходимой является только одна комбинация CUSTOMER-#, CH-ACCOUNT-#. Какую из них исключить? Если клиент не имеет текущего счета, то значение атрибута CH-ACCOUNT-# таблицы CUSTOMER для этого клиента является пустым. В то же время в таблице CHECKING-ACCOUNT значение атрибута CUSTOMER-# будет определено для каждого текущего счета. Это показывают минимальные мощности отношения на рис. 4. Итак, минимальная мощность со стороны CHECKING-ACCOUNT равна нулю, тогда как минимальная мощность со стороны CUSTOMER равна одному. Таким образом, в этом случае лучшим решением будет исключить CH-ACCOUNT-# из таблицы CUSTOMER. Мы получим:
CUSTOMER (CUSTOMER-#)
CHECKING-ACCOUNT (CH-ACCOUNT-#, CUSTOMER-#) Внешний ключ: CUSTOMER-# ссылается на CUSTOMER
Разумеется, в полной схеме базы данных для реального приложения обе эти таблицы будут иметь множество других атрибутов. Здесь мы показываем только те атрибуты, которые нужны для преобразования простой концептуальной модели, приведенной на рис. 4. Если бы объектные множества на рис. 4 имели другие атрибуты, то они были бы помещены в соответствующие таблицы. Разумеется, объект CUSTOMER может иметь атрибуты NAME, ADDRESS, PHONE-# (№-ТЕЛЕФОНА), a CHECKING-ACCOUNT может иметь атрибуты BALANCE (БАЛАНС) и DATE-OPENED (ДАТА-ОТКРЫТИЯ). Эти дополнительные атрибуты следующим образом видоизменяют схему нашей базы данных:
CUSTOMER (CUSTOMER-#, NAME, ADDRESS, PHONE-#)
CHECKING-ACCOUNT(CH-ACCOUNT-#, CUSTOMER-#, BALANCE, DATE-OPENED)
Внешний: ключ: CUSTOMER-# ссылается на CUSTOMER
Резюме: отношение один – к - одному преобразуется путем помещения одного из объектных множеств в качестве атрибута в таблицу второго объектного множества. Его выбор определяется потребностями конкретного приложения. Во многих случаях оба варианта приемлемы.
Отношение один – ко - многим. Предположим, что отношение HAS-CHKG-ACCOUNT (ИМЕЕТ-ТЕКУЩИЙ-СЧЕТ) имеет мощность «много» со стороны CHECKING-ACCOUNT. Это означает, что у клиента может быть несколько текущих счетов, но каждым текущим счетом по-прежнему пользуется только один клиент. В этом случае мощность один – ко - многим сама по себе определяет следующую структуру реляционных таблиц:
CHECKING-ACCOUNT (CH-ACCOUNT-#, CUSTOMER-#) Внешний ключ: CUSTOMER-# ссылается на CUSTOMER
CUSTOMER (CUSTOMER-#)
Таким образом, в любом отношении один – ко - многим в таблицу, описывающую объект, мощность со стороны которого равна «многим», включается столбец, являющийся внешним ключом, указывающим на другой объект. В нашем примере объект, мощность со стороны которого равна «многим», описывает таблица CHECKING-ACCOUNT, поэтому в нее включается внешний ключ CUSTOMER-#.
Отношение много – ко - многим. На рис. отношение ИМЕЕТ-CHECKING-ACCOUNT имеет мощность много – ко - многим. Таким образом, мы предполагаем, что у клиента может быть несколько текущих счетов, и что каждым текущим счетом могут пользоваться несколько клиентов.
Рис. 5. Отношение модели банка, имеющее мощность много – ко - многим
Для того чтобы преобразовать отношение много – ко - многим, мы создаем таблицу пересечения. В нашем случае нам потребуются три таблицы: по одной на каждое объектное множество и одна для отношения HAS-CHKG-ACCOUNT:
CUSTOMER (CUSTOMER-#)
CHECKING-ACCOUNT (CH-ACCOUNT-#)
HAS-CHKG-ACCOUNT (CUSTOMER-#, CH-ACCOUNT-#)
Внешние ключи: CUSTOMER-# ссылается на CUSTOMER
CH-ACCOUNT-# ссылается на CHECKING-ACCOUNTТаблица пересечения. Таблица, представляющая элементы двух других таблиц, находящихся в отношении много -ко- многим.
Поскольку CUSTOMER-# не определяет CH-ACCOUNT-#, а СН-ACCOUNT-# не определяет CUSTOMERS, ключом таблицы HAS-GHKG-ACCOUNT будут оба этих столбца. Таблица HAS-CHKG-ACCOUNT содержит данные, определяющие, какие клиенты владеют каждым текущим счетом, На рис. 6 представлены образцы данных наших трех таблиц.
Рис. 6. Таблица пересечения для отношения много – ко - многим
Обратите внимание, что каждый из клиентов 1111 и 2222 имеет по два разных текущих счета, а каждым из счетов ТС777 и ТС888 владеют два разных клиента. Эти отношения показывает таблица HAS-CHKG-ACCOUNT.
Обратите также внимание, что в таблице HAS-CHKG-ACCOUNT использованы только ключевые столбцы таблиц CUSTOMER и CHECKING-ACCOUNT. Таким образом, даже если бы таблицы CUSTOMER и CHECKING-ACCOUNT имели дополнительные столбцы, таблица HAS-CHKG-ACCOUNT содержала бы только ключевые столбцы этих двух таблиц. Это иллюстрирует следующая схема:
CUSTOMER (CUSTOMER-#, NAME, ADDRESS, PHONE-#) CHECKING-ACCOUNT (CH-ACCOUNT-#, BALANCE, DATE OPENED) HAS-CHKG-ACCOUNT (CUSTOMER-#, CH-ACCOUNT-#])
Внешние ключи:
CUSTOMER-# ссылается на CUSTOMER
CH-ACCOUNT-# ссылается на CHECKING-ACCOUNT.
Описания внешних ключей показывают, что оба ключевых атрибута таблицы HAS-CHKG-ACCOUNT являются также внешними ключами. Таблица HAS-CHKG-ACCOUNT называется таблицей пересечения, так как она показывает, как связаны элементы таблиц CUSTOMER и CHECKING-ACCOUNT. Как мы увидим в следующем разделе, таблица пересечения, такая как HAS-CHKG-ACCOUNT, может иметь дополнительные неключевые атрибуты, присущие только ей.
