单向多列 UNIQUE 约束
One-way multi column UNIQUE constraint
我有一个系统,我试图在其中描述两个目标之间基于事件的交互。在我们的系统中,一个事件(交互)有一个“来源”和一个“目标”(基本上就是谁对谁[做了什么]):
-- tried to remove some of the "noise" from this for the sake of the post:
CREATE TABLE interaction_relationship (
id integer CONSTRAINT interaction_pk PRIMARY KEY,
source_id integer CONSTRAINT source_fk NOT NULL REFERENCES entity(id),
target_id integer CONSTRAINT target_fk NOT NULL REFERENCES entity(id),
-- CONSTRAINT(s)
CREATE CONSTRAINT interaction_relationship_deduplication UNIQUE(source_id, target_id)
);
约束 interaction_relationship_deduplication
是我问题的来源:
在我们的系统中,一个来源可以与一个目标多次交互,但这种关系只能存在一次,也就是说,如果我是一名修理汽车的机械师,我可能会在我的店里多次看到那辆车, 但我和那辆车只有一个关系:
id
source_id
target_id
a
123abc
456def
b
123abc
789ghi
理想情况下,此 table 也表示单向关系。 source_id
始终是交互的“所有者”,即如果汽车 456def
运行 在机械师 123abc
上方,interaction_relationship
table:
id
source_id
target_id
1
123abc
456def
2
123abc
789ghi
3
456def
123abc
那么,我的问题是:UNIQUE
对多列是否考虑了值顺序?或者以上会导致失败吗?
does UNIQUE
on multiple columns take value order into consideration?
是的。元组(123abc, 456def)
不同于元组(456def, 123abc)
,它们可能同时存在于table中。
也就是说,您可能想要删除 surrogate id
from the relationship table, there's hardly any use for it. A relation table (as opposed to an entity table, and even there) would do totally fine with a multi-column primary key, which is naturally 源和目标的组合。
我有一个系统,我试图在其中描述两个目标之间基于事件的交互。在我们的系统中,一个事件(交互)有一个“来源”和一个“目标”(基本上就是谁对谁[做了什么]):
-- tried to remove some of the "noise" from this for the sake of the post:
CREATE TABLE interaction_relationship (
id integer CONSTRAINT interaction_pk PRIMARY KEY,
source_id integer CONSTRAINT source_fk NOT NULL REFERENCES entity(id),
target_id integer CONSTRAINT target_fk NOT NULL REFERENCES entity(id),
-- CONSTRAINT(s)
CREATE CONSTRAINT interaction_relationship_deduplication UNIQUE(source_id, target_id)
);
约束 interaction_relationship_deduplication
是我问题的来源:
在我们的系统中,一个来源可以与一个目标多次交互,但这种关系只能存在一次,也就是说,如果我是一名修理汽车的机械师,我可能会在我的店里多次看到那辆车, 但我和那辆车只有一个关系:
id | source_id | target_id |
---|---|---|
a | 123abc | 456def |
b | 123abc | 789ghi |
理想情况下,此 table 也表示单向关系。 source_id
始终是交互的“所有者”,即如果汽车 456def
运行 在机械师 123abc
上方,interaction_relationship
table:
id | source_id | target_id |
---|---|---|
1 | 123abc | 456def |
2 | 123abc | 789ghi |
3 | 456def | 123abc |
那么,我的问题是:UNIQUE
对多列是否考虑了值顺序?或者以上会导致失败吗?
does
UNIQUE
on multiple columns take value order into consideration?
是的。元组(123abc, 456def)
不同于元组(456def, 123abc)
,它们可能同时存在于table中。
也就是说,您可能想要删除 surrogate id
from the relationship table, there's hardly any use for it. A relation table (as opposed to an entity table, and even there) would do totally fine with a multi-column primary key, which is naturally 源和目标的组合。