如何防止一元一对多 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.
在非定向一元关系中,防止逻辑重复的最佳选择是什么?
例如
主要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.