Реферат: Иерархические структуры данных в реляционных БД
"NAME" VARCHAR(200) CHARACTER SET WIN1251 NOT NULL,
"PARENT_ID" INTEGER
CHECK(
"PARENT_ID" = ANY(SELECT "ID" FROM "CATALOG") or "PARENT_ID" is NULL
),
"LEVEL" INTEGER DEFAULT 1 NOT NULL
);
Структура для хранения иерархии с неограниченным числом уровней вложенности и потомков готова.
Следующей по степени универсальности является иерархия с неограниченным числом уровней вложенности и конечным числом потомков элемента иерархии. Ограничение количества потомков позволяет хранить данные в следующем виде.
Ссылка на предка
Информация о первом элементе уровня иерархии
Информация о втором элементе уровня иерархии
…
Информация о n-ном элементе уровня иерархии, где n – количество максимальное количество потомков
Ссылка на предка содержит в себе ссылку на запись, хранящую информацию о предыдущем уровне иерархии и смещение (номер столбца) с описанием родителя.
В нашем примере мы ограничим количество предков числом 5, тогда SQL-описание таблицы будет выглядеть следующим образом:
CREATE TABLE "CATALOG2" ( "LEVEL" INTEGER NOT NULL, "OFFSET" SMALLINT NOT NULL CHECK("OFFSET" > 0 and "OFFSET" < 6), "NAME_1" VARCHAR(200) CHARACTER SET WIN1251, "NAME_2" VARCHAR(200) CHARACTER SET WIN1251, "NAME_3" VARCHAR(200) CHARACTER SET WIN1251, "NAME_4" VARCHAR(200) CHARACTER SET WIN1251, "NAME_5" VARCHAR(200) CHARACTER SET WIN1251, "PARENT_LEVEL" INTEGER, "PARENT_OFFSET" SMALLINT CHECK(("PARENT_OFFSET" > 0 and "PARENT_OFFSET" < 6) or ("PARENT_OFFSET" is NULL)), CONSTRAINT "PK_CATALOG2" PRIMARY KEY("LEVEL","OFFSET") ); |
Больших преимуществ использования такой структуры я не вижу, недостаток же налицо – при изменении максимального количества потомков одного узла придется добавлять еще один столбец таблицы, что крайне неудобно. По этой причине подробно рассматривать эту структуру мы не станем, а перейдем к следующему случаю – иерархии с конечным числом уровней вложенности и бесконечным числом потомков узла.