问题描述
我有一个系统,我试图在其中描述两个目标之间基于事件的交互。在我们的系统中,一个事件(交互)有一个“源”和一个“目标”(基本上是谁对谁[做了什么]):
-- 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 |
---|---|---|
一 | 123abc | 456def |
b | 123abc | 789ghi |
理想情况下,此表也代表单向关系。 source_id
始终是交互的“所有者”,即如果汽车 456def
碾过机械师 123abc
,interaction_relationship
表中将有另一个条目:
id | source_id | target_id |
---|---|---|
1 | 123abc | 456def |
2 | 123abc | 789ghi |
3 | 456def | 123abc |
那么,我的问题是:多列上的 UNIQUE
是否考虑了值顺序?或者以上会导致失败?
解决方法
多列上的 UNIQUE
是否考虑值顺序?
是的。元组(123abc,456def)
与元组(456def,123abc)
不同,它们可能同时存在于表中。
也就是说,您可能想从关系表中删除 surrogate id
,它几乎没有任何用处。关系表(相对于实体表,甚至实体表)对于多列主键完全没问题,它是 naturally 源和目标的组合。