在非定向一元关系中,防止逻辑重复的最佳选择是什么?
例如
主表
ID
--
1
2
关系表
ID1 ID2
-----------
1 2
2 1
关系表中的条目二已经在逻辑上由第一个条目表示,因为关系是无方向的
在非定向一元关系中,防止逻辑重复的最佳选择是什么?
例如
主表
ID
--
1
2
关系表
ID1 ID2
-----------
1 2
2 1
关系表中的条目二已经在逻辑上由第一个条目表示,因为关系是无方向的
在许多情况下,表中的两行都非常便于查询。也就是说,如果您只想要一个,这里有两种选择。
首先,坚持认为id1 < id2这对是独一无二的:
alter table relations add constraint check (id1 < id2);
alter table relations add constraint unique (id1, id2);
这可能会产生一些意想不到的后果。您无法插入(2, 1)表中。
第二种方法是创建基于函数的唯一索引。并非所有数据库都直接支持这一点,但通常有类似的语法可用。大多数数据库支持least()and greatest(),所以:
create unique index unq_id1_id2
on (least(id1, id2), greatest(id1, id2));
在 SQL Server 中,您可以使用计算列执行此操作:
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);
这是一个 db<>fiddle。