如何防止一元一对多 SQL 关系中的逻辑重复 table

How to prevent logical duplicates in a unary one to many SQL relationship table

在非定向一元关系中,防止逻辑重复的最佳选择是什么?

例如

主要table

ID
--
1
2

关系table

ID1    ID2
-----------
1      2
2      1

关系中的条目二 table 已由第一个条目在逻辑上表示,因为关系是非定向的

在许多情况下,在 table 中包含两行对于查询非常方便。也就是说,如果你只想要一个,这里有两个选项。

首先,坚持 id1 < id2 并且该对是唯一的:

alter table relations add constraint check (id1 < id2);
alter table relations add constraint unique (id1, id2);

这可能会产生一些意想不到的后果。您无法将 (2, 1) 插入 table.

第二种方法是创建基于函数的唯一索引。并非所有数据库都直接支持这一点,但通常有类似的语法可用。大多数数据库支持 least()greatest(),所以:

create unique index unq_id1_id2
    on (least(id1, id2), greatest(id1, id2));

在 SQL 服务器中,您可以使用计算列执行此操作:

alter table relations add least_id1_id2 as
    (case when id1 < id2 then id1 else id2 end) persisted;

alter table relations add greatest_id1_id2 as
    (case when id1 < id2 then id2 else id1 end) persisted;

create unique index unq_relations_id1_id2 on relations(least_id1_id2, greatest_id1_id2);

Here 是一个 db<>fiddle.