У меня есть дерево групп, представленное двумя таблицами.
Первая просто содержит данные групп:
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
может упростить задачу, но мне не разрешено реорганизовывать все это целиком.