我有一个数据结构,我必须在其中存储元素对。每对中正好有 2 个值,因此我们使用了一个表,其中包含字段 (leftvalue, rightvalue....)。
这些对应该是唯一的,如果键被更改,它们被认为是相同的。
Example: (Fruit, Apple) is the same as (Apple, Fruit).
如果有可能以一种有效的方式,我会在字段上设置数据库约束,但不会以任何代价 - 性能更重要。
我们目前正在使用
MSSQL server 2008
,但可以进行更新。有没有一种有效的方法来实现这一目标?
最佳答案
两种解决方案,实际上都是将问题变成更简单的解决方案。如果强制改变消费者是可以接受的,我通常更喜欢 T1
解决方案:
create table dbo.T1 (
Lft int not null,
Rgt int not null,
constraint CK_T1 CHECK (Lft < Rgt),
constraint UQ_T1 UNIQUE (Lft,Rgt)
)
go
create table dbo.T2 (
Lft int not null,
Rgt int not null
)
go
create view dbo.T2_DRI
with schemabinding
as
select
CASE WHEN Lft<Rgt THEN Lft ELSE Rgt END as Lft,
CASE WHEN Lft<Rgt THEN Rgt ELSE Lft END as Rgt
from dbo.T2
go
create unique clustered index IX_T2_DRI on dbo.T2_DRI(Lft,Rgt)
go
在这两种情况下,
T1
和 T2
都不能在 Lft,Rgt
对中包含重复值。关于sql - 对两个字段的唯一约束,以及它们的相反,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23103462/