Обеспечить ссылочную целостность на материализованном пути?
Я пытаюсь реализовать древовидную структуру, используя материализованную модель пути, описанную здесь: http://www.dbazine.com/oracle/or-articles/tropashko4 .
Можно ли обеспечить ссылочную целостность поля [path]? Я не вижу, как SQL может это сделать, должен ли я делать это вручную в DAL?
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]". Я сделал это пару лет назад, описано здесь:
Сохраните параметры конфигурации в виде иерархии в базе данных