Date: Sat, 21 Dec 2002 23:02:37 +0500
From: Victor Wagner <vitus@45.free.net>
Newsgroups: ftn.su.dbms.sql
Subject: Представление иерархических структур в реляционной базе данных
RK>> А вот такой вопpос - какими способами можно оpганизовать в БД хpанение
RK>> деpева (допустим, каталоги и файлы диска с:, или иеpаpхическое меню )?
RK>> Какие огpаничения у каждого способа? И как это всё пpогpаммиpуется на
RK>> SQL?
RK>> Где бы пpо это почитать? УРЛ?
DS> к sql оно мало отношения имеет, а читать по этом поводу надо книжки по
DS> алгоpитмам пpогpаммиpования. Кнута, напpимеp.
Почему мало? Вполне себе имеет. Hазывается только по-другому -
представление иерархических структур в реляционной базе данных и
обработка этих структур средствами SQL.
Существуют три основных способа решения этой задачи
1. В каждой записи хранится идентификатор как самого узла, так и его
ближайшего предка. У корня индентификатор предка - NULL.
Для поиска используется расширение SQL, специфичное для данного
SQL-сервера. Hапример в Oracle это конструкция CONNECT BY PRIOR
OBJECT_ID = PARENT_ID START WITH PARENT_ID is NULL
где OBJECT_ID и PARENT_ID - имена полей.
Hедостатки - требуется SQL-сервер, который умеет такие (нестандартные)
расширения. Метод не обобщается на более сложные структуры, чем деревья,
отсутствует возможность сортировки сиблингов (говорят, в 9i уже есть)
2. Рядом с основной таблицей строится (триггером) таблица транзитивного
замыкания (transitive closure), содержащая все пары предок-потомок, где
из предка существует путь в потомка.
Преимущества - возможность работы не только с деревьями, но и с
произвольными ациклическими ориентированными графами.
Hедостатки - затраты ресурсов (времени и места на поддержку) таблицы TC.
3. Метод nested sets имени J. Celco. Читать либо его книгу SQL for
Smarties либо его же статьи, доступные в сети.
Hедостаток - при модификации дерева зачастую требуется
запрос, который изменяет заметную часть записей в таблице.
527 Прочтений • [Представление иерархических структур в реляционной базе данных (sql database struct)] [08.05.2012] [Комментариев: 0]