У меня есть база данных, содержащая иерархию категорий, хранящихся с использованием модели списка смежности.
Иерархия имеет 3 уровня глубины (не включая воображаемый корень node) и содержит приблизительно 1700 узлов. Узлы второго и третьего уровней могут иметь несколько родителей. Дополнительная таблица используется для отношений "многие-ко-многим", как показано ниже:
CREATE TABLE dbo.Category(
id int IDENTITY(1,1) NOT NULL,
name varchar(255) NOT NULL,
)
CREATE TABLE dbo.CategoryHierarchy(
relId int IDENTITY(1,1) NOT NULL,
catId int NOT NULL,
parentId int NOT NULL,
)
Если я перейду к использованию метода транзитивной таблицы закрытия (ради целостности данных и т.д.), существует ли относительно простой запрос, который мог бы генерировать значения для таблицы закрытия? (с использованием SQL Server 2005)
Я просматриваю статьи и презентации, такие как Bill Karwin Модели для иерархических данных, но имеет только запросы на вставку для одного node и для меня потребовалось бы навсегда создать мое дерево.
Спасибо.
РЕДАКТИРОВАТЬ:
RelID в таблице CategoryHierarchy используется исключительно для первичного ключа, он не имеет отношения к идентификаторам node таблицы Category.
Кроме таблицы закрытия, я имею в виду таблицу, подобную этой:
CREATE TABLE ClosureTable (
ancestor int NOT NULL,
descendant int NOT NULL,
[length] int NOT NULL,
)
Если первые два столбца являются составным первичным ключом и являются отдельными внешними ключами для Category.id.