0

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

例如

主表

ID
--
1
2

关系表

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

关系表中的条目二已经在逻辑上由第一个条目表示,因为关系是无方向的

4

1 回答 1

2

在许多情况下,表中的两行都非常便于查询。也就是说,如果您只想要一个,这里有两种选择。

首先,坚持认为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。

于 2020-03-15T14:31:59.103 回答