单向多列 UNIQUE 约束

问题描述

我有一个系统,我试图在其中描述两个目标之间基于事件的交互。在我们的系统中,一个事件(交互)有一个“源”和一个“目标”(基本上是谁对谁[做了什么]):

-- 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 碾过机械师 123abcinteraction_relationship 表中将有另一个条目:

id source_id target_id
1 123abc 456def
2 123abc 789ghi
3 456def 123abc

那么,我的问题是:多列上的 UNIQUE 是否考虑了值顺序?或者以上会导致失败?

解决方法

多列上的 UNIQUE 是否考虑值顺序?

是的。元组(123abc,456def)与元组(456def,123abc)不同,它们可能同时存在于表中。


也就是说,您可能想从关系表中删除 surrogate id,它几​​乎没有任何用处。关系表(相对于实体表,甚至实体表)对于多列主键完全没问题,它是 naturally 源和目标的组合。