单向多列 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 源和目标的组合。