Древовидная структура в реляционной базе данных с осями навигации

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

Пример таблицы:

CREATE TABLE tbl (
    id INT PRIMARY NOT NULL,
    parent INT NULL,
    sort1 INT,
    sort2 INT
);

Описывать здесь такие оси навигации, как Parent, Child, Following Sibling, Preceding Sibling здесь не будем, они реализуются на основе поля parent и sort1 довольно просто. А вот более интересные оси навигации, такие как Ancestor, Preceding, Following и наиболее востребованная Descendant, реализуются так:

Axis

Сортировка идет последовательно через поле sort1 через потомков и возвращается в поле sort2.

Ancestor:

SELECT * FROM tbl WHERE sort1<14 AND sort2>25

Preceding:

SELECT * FROM tbl WHERE sort1<14 AND sort2<25

Following:

SELECT * FROM tbl WHERE sort1>14 AND sort2>25

Descendant:

SELECT * FROM tbl WHERE sort1>14 AND sort2<25

Выборку по другим осям навигации можно получить с использованием поля parent, например, у осей навигации Preceding Sibling и Following Sibling значение поля parent такое же, что и у центрального узла, а оси навигации Parent и Child вообще не требуют использования полей sort1 и sort2.

30 августа 2012