给定一个(postgres)表,
CREATE TABLE links (
id bigint NOT NULL,
url text NOT NULL,
owner_id bigint NOT NULL
);
url
当且仅当它们也具有相同的owner_id
.
即这将是允许的:
id | url | owner_id
----+-----+---------
7 | foo | 1
8 | bar | 1
9 | bar | 1
但这不会:
id | url | owner_id
----+-----+---------
7 | foo | 1
8 | bar | 1
9 | bar | 2
有没有办法强制执行这样的约束?
您可以使用 EXCLUDE 约束。您将需要一个辅助扩展来获得正确的运算符来使用。
您需要规范化您的表格。
显然,
url
与 具有多对一的关系owner
,因此它应该放在自己的表中。这种标准化设计的缺点是您现在需要加入
url
以找出它是什么owner_id
。因此,如果您还想
links
包含owner_id
,那么您可以提供url
一个多列辅助键。这种设计仍然确保每个
url
只有一个owner_id
,但links
随后将这两列一起引用。url
如果您觉得url.url
太宽,您也可以给一个代理键。