Управление иерархическими данными с использованием столбцов ID,ParentID
в СУБД известно как модель Список смежностей . В то время как очень легко реализовать и поддерживать (то есть вставить, обновить, удалить), определить родословную (то есть предков и потомков) дорого. Как уже написали другие ответы, Oracle CONNECT BY
будет работать, но это дорогостоящая операция. Возможно, вам лучше представлять свои данные по-другому.
Для вашего случая самое простое решение - добавить в вашу схему таблицу, называемую Hierarchy Bridge , и добавить столбец LEVEL
в исходную таблицу. В таблице есть столбцы ID,DescendantID
, в результате чего выбор по ID дает все записи потомков, а выбор по DescentantID - все записи предков. LEVEL
необходимо в базовой таблице для заказа записей. Таким образом, вы делаете компромисс между дорогими обновлениями и дешевым чтением, что и подразумевает ваш вопрос.
Другие возможности, которые включают изменение ваших базовых данных, включают представления «Вложенный набор» и «Материализованный путь». Это предлагает аналогичные компромиссы более дорогих записей для гораздо более дешевых операций чтения. Полный список опций, плюсов и минусов, а также некоторые замечания по реализации см. В моем предыдущем вопросе по теме .