Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Моделирование иерархических объектов средствами...doc
Скачиваний:
5
Добавлен:
08.09.2019
Размер:
9.85 Mб
Скачать

3. Два важных частных случая

В общем случае дерево может иметь любое количество уровней, а узел – любое количество потомков. В практических задачах число уровней и/или количество потомков может быть ограничено. Для этих случаев существуют специальные варианты моделирования иерархий средствами реляционных СУБД, которые мы здесь кратко рассмотрим.

3.1. Случай ограниченного количества уровней иерархии

Пусть иерархия не может иметь более n уровней, а каждый узел может иметь любое количество потомков. Тогда её можно представить в виде следующей таблицы:

Таблица 9

Модель иерархии с ограниченным количеством предков

Идентификатор узла

Предок 1

Предок n-1

Содержательная

часть

Для нашего примера абстрактной иерархии (рис. 8), состоящей из 4 уровней, если полагать количество уровней в ней фиксированным, заполненная таблица будет выглядеть следующим образом:

Таблица 10

Заполненная таблица модели иерархии с ограничением по числу предков

Уникальный

идентификатор узла

Предки

Содержательная

часть

1

2

3

A

NULL

NULL

NULL

A

B

A

NULL

NULL

B

C

A

NULL

NULL

C

D

A

B

NULL

D

E

A

B

NULL

E

F

A

C

NULL

F

G

A

C

NULL

G

H

A

C

NULL

H

I

A

B

D

I

J

A

B

E

J

K

A

B

E

K

L

A

B

E

L

O

A

C

F

O

M

A

C

G

M

N

A

C

G

N

P

A

C

H

P

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

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

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

Иногда, в зависимости от сложности иерархии, в столбцах, где хранятся идентификаторы предков элементов, может быть большое количество неопределённых значений (говорят, что таблица получается «рыхлой»). В этом случае можно использовать вариант данного подхода, где для каждого уровня иерархии создаётся отдельная таблица.

Вот как в этом случае может быть представлена наша абстрактная иерархия из четырёх уровней (табл. 11 - 14).

Таблица 11

Таблица, описывающая первый уровень (корень дерева)

Уникальный идентификатор узла

Содержательная часть

A

A

Таблица 12

Таблица второго уровня

Уникальный идентификатор узла

Предки

Содержательная часть

1

B

A

B

C

A

C

Таблица 13

Таблица третьего уровня

Уникальный идентификатор узла

Предки

Содержательная часть

1

2

D

A

B

D

E

A

B

E

F

A

C

F

G

A

C

G

H

A

C

H

Таблица 14

Таблица четвёртого уровня

Уникальный идентификатор узла

Предки

Содержательная часть

1

2

3

I

A

B

D

I

J

A

B

E

J

K

A

B

E

K

L

A

B

E

L

O

A

C

F

O

M

A

C

G

M

N

A

C

G

N

P

A

C

H

P

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

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