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)
);
假设我们有这个“匹配”逻辑,我们想在其中存储用户之间的匹配。我为 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)
);