Древовидная структура в реляционной базе данных с осями навигации
Для реализации в обычной реляционной базе данных древовидной структуры, по которой можно будет производить выборку по различным осям навигации одним запросом, по аналогии с 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
, реализуются так:
Сортировка идет последовательно через поле 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
.