Предположим, вы хотите иметь иерархию thing
s, в которой thing
может иметь несколько thing
родителей и детей:
CREATE TABLE thing (
id SERIAL PRIMARY KEY
);
CREATE TABLE thing_association (
parent_id INTEGER NOT NULL,
child_id INTEGER NOT NULL,
PRIMARY KEY (parent_id, child_id),
CHECK (parent_id != child_id),
FOREIGN KEY (parent_id) REFERENCES thing(id),
FOREIGN KEY (child_id) REFERENCES thing(id)
);
Ограничение CHECK
предотвращает thing
от наличие отношения с самим собой, а ограничение PRIMARY KEY
предотвращает дублирование отношений, но можно ли предотвратить циклы?
Точнее, если строка (x, y)
существует в таблице thing_association
, может ли строка (y, x)
быть запрещенным для вставки?
Пойдем дальше, если в thing_association
существуют строки (x, y)
и (y, z)
, можно ли предотвратить вставку строки (z, x)
?