Декомпозиция универсального отношения
. Очевидный выход, избавляющий от избыточного дублирования данных, состоит в расщеплении (декомпозиции) отношения USPJ на четыре взаимосвязанных отношения – S, P, J, SPJ. Каждое из этих отношений является проекцией USPJ
на соответствующие группы атрибутов[27]:
S = (USPJ[S#, Sn, St, Sci]) RENAME SCi AS Ci;
P = (USPJ[P#, Pn, Co, We, PCi]) RENAME Pci AS Ci;
J = (USPJ[J#, Jn, Jci]) RENAME Jci AS Ci;
SPJ = USPJ[S#, P#, J#, Dt, Qt];
Ниже приведены значения этих отношений для рассматриваемого примера.
S | P
| ||||||||||||||||||
S# | Sn | St | Ci | P# | Pn | Co | We | Ci | |||||||||||
S1 | Иван | 50 | Яя | P3 | шайба | Ж | 20 | Ош | |||||||||||
S2 | Петр | 100 | Ош | , | P1 | гайка | К | 10 | Яя , | ||||||||||
S3 | Джон | 50 | Яя | P8 | болт | Ч | 30 | Яя | |||||||||||
S8 | Боб | 50 | Томск | P2 | винт | С | 40 | Ош |
J | SPJ | ||||||||||||||
J# | ... | S# | P# | J# | Qt | Dt | |||||||||
J1 | ... | , | S1 | P3 | J1 | 1000 | ... | ||||||||
J2 | ... | S1 | P1 | J1 | 1000 | ... | |||||||||
S1 | P8 | J1 | 500 | ... | |||||||||||
S2 | P3 | J2 | 1000 | ... , | |||||||||||
S3 | P2 | J2 | 2000 | ... | |||||||||||
S3 | P1 | J2 | 1000 | ... | |||||||||||
S8 | P8 | J2 | 500 | … |
Нетрудно убедиться в том, что в этих отношениях сохранены все отмеченные ФЗ. Естественное соединение этих проекций
USPJ = (((((SPJ JOIN S) RENAME Ci AS Sci)
JOIN P) RENAME Ci AS Pci)
JOIN J) RENAME Ci AS Jci;
восстановит универсальное отношение без всяких потерь информации. Кроме того, в этой структуре объявлены все ФЗ, за исключением S.Ci ® St.
Здесь нет аномалий удаления. Из отношения SPJ
можно удалять кортежи без проблем. При удалении кортежей других отношений достаточно соблюдать правила ссылочной целостности, которые объявлены определениями отношений (см. п. 2.4.2). Нет также аномалий вставки типа б).
Сведения о непоставлявших поставщиках, непоставлявшихся деталях и о не получавших поставок изделиях можно заносить в соответствующие отношения.
Аномалии вставки типа а) и обновления значений сохраняются для отношения S. Это обусловлено наличием необъявленной ФЗ между неключевыми атрибутами S.Ci ® St.
Можно попытаться избавиться от цепочки транзитивных зависимостей S# ® Ci ® St, заменив S его проекциями. При этом не должны быть потеряны ФЗ, и естественное соединение проекций должно восстанавливать исходное отношение. Для иллюстрации проблем, которые здесь могут возникнуть, рассмотрим возможные варианты декомпозиции.
Вариант 1.
SST= S[S#, Sn, St]; CS=S[S#, Ci];
Эти проекции для реализации USPJ, приведенной в п. 3.1.2, имеют вид:
SST |
CS |
||||
S# |
Sn |
St |
|
S# |
Ci |
S1 |
Иван |
50 |
; |
S1 |
Яя |
S2 |
Петр |
100 |
S2 |
Ош |
|
S3 |
Джон |
50 |
S3 |
Яя |
|
S8 |
Боб |
50 |
S8 |
Томск |
SST JOIN CS |
|||
S# |
Sn |
St |
Ci |
S1 |
Иван |
50 |
Яя |
S2 |
Петр |
100 |
Ош |
S3 |
Джон |
50 |
Яя |
S8 |
Боб |
50 |
Томск |
Здесь сохранены ФЗ S# ® Сi, S# ® St, S# ® Sn. Однако зависимость Ci ® St утрачена. Значения атрибутов Ci и St в проекциях можно менять независимо.
Вариант 2.
SST = S[S#, Sn, St]; STC = S[St, Ci];
Это плохой вариант. Здесь утеряна зависимость S# ® Ci. Поэтому возможна потеря информации при восстановлении исходного отношения. В самом деле, эти проекции имеют вид:
SST |
STC |
||||
S# |
Sn |
St |
|
St |
Ci |
S1 |
Иван |
50 |
50 |
Яя |
|
S2 |
Петр |
100 |
100 |
Ош |
|
S3 |
Джон |
50 |
50 |
Томск |
|
S8 |
Боб |
50 |
SST JOIN STC |
|||
S# |
Sn |
St |
Ci |
S1 |
Иван |
50 |
Яя |
S2 |
Петр |
100 |
Ош |
S3 |
Джон |
50 |
Яя |
S1 |
Иван |
50 |
Томск |
S3 |
Джон |
50 |
Томск |
Это совсем не похоже на исходное отношение. Мало того, что в нем появились ложные кортежи. Атрибут S#
утратил свойство потенциального ключа. Это следствие того, что общие атрибуты отношений STS, STC не являются их потенциальными ключами.
Вариант 3.
SC = S[S#, Sn, Ci]; CS=S[Ci, St];
Эти проекции имеют вид:
SC |
CS |
||||
S# |
Sn |
Ci |
|
St |
Ci |
S1 |
Иван |
Яя |
50 |
Яя |
|
S2 |
Петр |
Ош |
100 |
Ош |
|
S3 |
Джон |
Яя |
50 |
Томск |
|
S8 |
Боб |
Томск |
Естественное соединение SC и CS будет происходить без потерь информации, то есть в результате соединения не появятся кортежи, которых не было в исходном отношении. Это следствие того, что Ci – общий атрибут SC и CS, является потенциальным ключом CS. Каждому значению Ci соответствует единственный кортеж CS, который будет при соединении сливаться с соответствующими кортежами SC и образовывать, таким образом, только те кортежи, которые его породили при выполнении проекции S[Ci, St].