Tenho duas tabelas em um banco de dados Postgres 17: site
e page
. Cada site pode ter várias páginas e cada página pode ter uma página pai:
CREATE TABLE site (
id INT PRIMARY KEY
);
CREATE TABLE page (
id INT PRIMARY KEY,
site_id INT references site(id),
parent_id INT references page(id)
);
Agora suponha que eu tenha dois sites:
INSERT INTO site (id) VALUES (1);
INSERT INTO site (id) VALUES (2);
E uma página raiz para cada site:
INSERT INTO page (id, site_id, parent_id) VALUES (1, 1, NULL);
INSERT INTO page (id, site_id, parent_id) VALUES (2, 2, NULL);
Como evitar a inserção de uma nova página para o site 2 com uma página pai que pertence ao site 1?
INSERT INTO page (id, site_id, parent_id) VALUES (3, 2, 1);
Para garantir que a página pai aponte para o mesmo site:
violino
A restrição FK multicoluna
page_hierarchy_fk
adicionasite_id
à referência, então o pai deve apontar para o mesmo site. Esta FK requer umaUNIQUE
restrição redundante empage(id, site_id)
.Também coloquei uma
CHECK
restrição para proibir auto referências. Agora você não pode criar círculos com inserções de linha única. Mas você ainda pode criar círculos em dois ou mais hubs com inserções de várias linhas ou com umUPDATE
. Se isso for um problema, crie um gatilho (potencialmente caro) que percorra o gráfico em insert / update para descartar loops infinitos.Relacionado: