Обеспечить ссылочную целостность на материализованном пути?


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

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

4 5

4 ответа:

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

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

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

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

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

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

EDIT

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

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

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

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

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

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