Обеспечить ссылочную целостность на материализованном пути? - PullRequest
5 голосов
/ 07 августа 2009

Я пытаюсь реализовать древовидную структуру, используя описанную здесь модель Материализованного Пути: http://www.dbazine.com/oracle/or-articles/tropashko4.

Можно ли обеспечить ссылочную целостность в поле [путь]? Я не понимаю, как SQL может это сделать, нужно ли делать это вручную в DAL?

Ответы [ 4 ]

3 голосов
/ 08 августа 2009

«Материализованный путь», представленный Вадимом Тропашко в этой статье, вводит понятие порядка в отношение («Джонс - второй член».).

«Материализованный путь» - это не что иное, как «некоторая форма материализованного представления» о транзитивном замыкании, и поэтому он испытывает все те же проблемы, что и любой другой «материализованный взгляд», за исключением того, что с точки зрения алгоритма дела обстоят хуже закрытия.

SQL практически полностью бессилен, когда действуют ограничения на замыкание. (Значение: да, SQL требует, чтобы вы все делали сами.) Это одна из тех областей, где RM демонстрирует максимум своей почти неограниченной мощности, но SQL терпит неудачу ужасно, и где такой позор, что большинство людей ошибается в SQL для того, чтобы быть реляционным.

(@ Билл Карвин: Я хотел бы дать вам +1 за ваше замечание о связи между глубиной деревьев и результатом на производительность. Нет известных алгоритмов для вычисления замыканий, которые хорошо работают в случай деревьев с "сумасшедшими" глубинами. Это алгоритмическая проблема, а не SQL или реляционная.)

EDIT

Да, RM = Реляционная модель

3 голосов
/ 07 августа 2009

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

Список смежности поддерживает ссылочную целостность, и это верно также для дизайна, который я называю « Таблица закрытия » (Тропашко называет этот дизайн «транзитивным отношением закрытия»).

1 голос
/ 07 августа 2009

В материализованной модели пути вы можете использовать произвольные строки (например, строки в юникоде, чтобы иметь более 256 дочерних элементов) вместо специальных строк формы "x.y.z" Идентификатор родителя - это идентификатор прямого потомка с последним удаленным символом . Вы можете легко применить это с помощью ограничения проверки, как (мой пример работает в PostgreSQL)

check(parent_id = substring(id from 1 for char_length(id)-1)),

в вашей команде создания таблицы. Если вы настаиваете на строках формы "x.y.z", вам придется поиграться с регулярными выражениями, но я думаю, что можно найти соответствующее проверочное ограничение.

0 голосов
/ 04 марта 2010

Да, мы можем "обеспечить ссылочную целостность в поле [путь]". Я сделал это пару лет назад, как описано здесь:

Сохранение настроек конфигурации в виде иерархии в базе данных

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...