Dada uma tabela (postgres),
CREATE TABLE links (
id bigint NOT NULL,
url text NOT NULL,
owner_id bigint NOT NULL
);
Eu gostaria de permitir que várias linhas tenham o mesmo url
se e somente se elas também tiverem o mesmo owner_id
.
Ou seja, isso seria permitido:
id | url | owner_id
----+-----+---------
7 | foo | 1
8 | bar | 1
9 | bar | 1
mas isso não seria:
id | url | owner_id
----+-----+---------
7 | foo | 1
8 | bar | 1
9 | bar | 2
Existe alguma maneira de impor tal restrição?
Você pode usar uma restrição EXCLUDE. Você precisará de uma extensão auxiliar para obter os operadores corretos a serem usados.
Você precisa normalizar suas tabelas.
Claramente,
url
tem um relacionamento muitos-um comowner
, portanto, deve ir em sua própria tabela.A desvantagem desse design normalizado é que agora você precisa ingressar
url
para descobrir o queowner_id
é.Portanto, se você quiser
links
também conterowner_id
, poderá fornecerurl
uma chave secundária de várias colunas.Esse design ainda garante que cada
url
um tenha apenas um únicoowner_id
, maslinks
se refere a ambas as duas colunas juntas.Você também pode fornecer
url
uma chave substituta, se achar queurl.url
é muito grande.