Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
dbbook(2010.04.15).pdf
Скачиваний:
52
Добавлен:
09.06.2015
Размер:
2.14 Mб
Скачать

Группа 2. Несколько родительских классов сущностей и один дочерний класс. Связи между классами могут быть произвольного вида. Такие кластеры приводят в реляционной модели к понятию ассоциации (дочерний класс ассоциирует, объединяет, родительские классы).

Группа 3. Один родительский и несколько дочерних классов. В зависимости от вида устанавливаемых между классами связей получим следующую классификацию кластеров:

1)обобщение – связи категориальные (полностью идентифицирующие);

2)композиция – связи обязательные на родительском конце связи;

3)агрегация – связи необязательные на родительском конце связи.

Примечание. Часто композиция называется композитной агрегацией и рассматривается как усиленная форма агрегации общего вида

Введение этих кластеров не означает, что разрабатываемый проект схемы базы данных должен обязательно описываться одним из них. Большие проекты включают разнообразные комбинации кластеров.

5.4. Иерархическая рекурсия

5.4.1. Абстрактная схема

Связь класса сущностей с самим собой называется рекурсивной (иногда такую связь называют «рыболовным крючком»). Рекурсивная связь типа не-более-один-ко-многим (0 : : : 1 : 0 : : : 1) называется

иерархической.

Иерархическая рекурсия определяет связь типа предок/потомок и позволяет хранить древовидную иерархию. В иерархии предок (экземпляр родительского класса сущностей) может иметь много потомков (экземпляров дочернего класса сущностей), но потомок имеет не более одного предка. Узел иерархии может выступать в роли и предка, и потомка. Один из узлов в иерархии предка не имеет (корень).

Виерархической рекурсивной связи один и тот же класс сущностей является и родительским,

идочерним одновременно. При задании иерархической рекурсивной связи первичный ключ должен мигрировать в качестве внешнего в состав неключевых атрибутов того же класса сущностей, то есть такая связь может быть только неидентифицирующей, и, кроме того, необязательной. В противном случае null-значения для внешнего ключа были бы не допустимы, и рекурсия была бы бесконечной.

Атрибуты не могут появляться дважды в одном классе сущностей под одним и тем же именем. Поэтому атрибуты мигрировавшего ключа обязательно должны получить имя роли.

Таким образом, в иерархической рекурсии атрибуты узла расширяются атрибутом (внешним ключом), представляющим необязательную ссылку на первичный ключ узла – непосредственного предка.

Построим абстрактные диаграммы (рис. 5.5, 5.6), реализующие иерархическую рекурсию в реляционной модели, и приведем пример в табличной форме (рис. 5.7).

Рис. 5.5.: Иерархическая рекурсия. Абстрактная презентационная диаграмма

Рис. 5.6.: Иерархическая рекурсия. Абстрактная ключевая диаграмма

Примечание. Здесь под Атрибутами, понятно, подразумеваются собственные атрибуты класса сущностей, не имеющие отношения к ключам (ключи – это тоже атрибуты)

Рис. 5.7.: Иерархическая рекурсия. Пример в табличной форме (см. рис. 5.6)

Как прийти к подобным построениям? Пусть есть некоторое множество узлов, определяемых кодом узла КодУ и некоторыми атрибутами:

Узлы(КодУ, Атрибуты) primary key(КодУ)

Подчеркнем, что пока это множество узлов, а не их иерархия. Каждый узел в иерархии имеет не более одного предка (корень предка не имеет). Поэтому достаточно просто ввести дополнительный атрибут, допускающий null-значения и ссылающийся на этого предка:

УзловИерархия(КодУ-Предок: null, КодУ, Атрибуты) primary key(КодУ)

foreign key(КодУ-Предок) references УзловИерархия(КодУ)

5.4.2. Обобщения

Может ли данная схема иерархической рекурсии описывать не одну иерархию, а несколько однотипных иерархий (то есть не дерево, а лес)? Да, так как число корневых узлов в схеме хранения данных может быть произвольным. Число хранимых деревьев – это число null-значений, появляющихся в значениях внешнего ключа КодУ-Предок.

Что делать, если дерево взвешенное, то есть каждой дуге сопоставлены некоторые атрибуты? Включить их в число атрибутов класса УзловИерархия и разрешить принимать им null-значения, так как для корневых узлов значения этих атрибутов не определены.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]