SQL - 创建唯一外键对的正确方法

SQL - Proper way to create unique pairs of foreign keys

假设我们有这个“匹配”逻辑,我们想在其中存储用户之间的匹配。我为 table 创建了这个模式,并想确定这是否是存储该信息的正确方法。

CREATE TABLE IF NOT EXISTS users (
    id INTEGER PRIMARY KEY,
    name VARCHAR (255) NOT NULL UNIQUE
);

CREATE TABLE IF NOT EXISTS matches (
    id INTEGER PRIMARY KEY,
    a INTEGER NOT NULL CHECK (a < b) REFERENCES users (id),
    b INTEGER NOT NULL CHECK (a < b) REFERENCES users (id),
    frequency INTEGER NOT NULL DEFAULT 0
);
CREATE UNIQUE INDEX IF NOT EXISTS matches_a_b_uidx ON matches (a, b);

我想确保没有重复的匹配项,所以如果 a=1 和 b=2,我们不能有 a=2 和 b=1,因为它们是相同的。还有,没有和自己匹配的。

这是重复的吗CHECK (a < b)构造这种逻辑的正确方法?

用一个 table 约束代替两列约束:

CREATE TABLE IF NOT EXISTS matches (
    id INTEGER PRIMARY KEY,
    a INTEGER NOT NULL REFERENCES users (id),
    b INTEGER NOT NULL REFERENCES users (id),
    frequency INTEGER NOT NULL DEFAULT 0,
    CHECK (a < b)
);