Как убедиться, что запись не может ссылаться на одного из своих дочерних элементов как на своего родителя - PullRequest
0 голосов
/ 13 июля 2020

У меня есть дерево групп, представленное двумя таблицами.

Первая просто содержит данные групп:

CREATE TABLE "group" (
    id uuid PRIMARY KEY,
    label VARCHAR
);

Вторая просто обрабатывает отношения между группами для моделирования tree:

CREATE TABLE tree (
    id uuid PRIMARY KEY,
    parent_id uuid REFERENCES tree(id),
    group_id uuid UNIQUE REFERENCES "group"(id)
);

Я хотел бы убедиться, что запись в tree не может ссылаться на один из своих дочерних элементов в поле parent_id.

Из того, что я понял, я не могу использовать CHECK, потому что он может использовать данные только из текущей записи, а я не могу использовать EXCLUDE, потому что у меня нет оператор, который мог бы сделать такое сравнение.

Я уже могу перечислить предков и потомков данной группы, используя рекурсивные CTE, но я не могу найти способ использовать его в ограничении. Вот скрипка, которая потенциально может прояснить, что я имею в виду (при необходимости).

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

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