同一个表中的多对多关系?

m0m*_*eni 0 database postgresql database-design many-to-many

我对设计数据库相对较新,我想知道在同一个表中的行之间实现多对多关系的规范方法是什么。

就我而言,我有一个公式表,我想说表中的两个公式是相关的:

公式表:

formula_id SERIAL PRIMARY KEY
name TEXT NOT NULL
formula TEXT NOT NULL
Run Code Online (Sandbox Code Playgroud)

我假设我会创建一个名为 related_formulas 的新表,然后执行以下操作:

formula_relation_id SERIAL PRIMARY KEY
formula_id INT REFERENCES formulas (formula_id) ON DELETE CASCADE
formula_id2 INT REFERENCES formulas (formula_id) ON DELETE CASCADE
Run Code Online (Sandbox Code Playgroud)

但后来我预见到了一些问题,例如阻止同一行中的两个 id 具有相同的值。我确信由于我自己的经验不足,还有其他潜在的问题我没有看到。

有人能指出我正确的方向吗?

Ama*_*dan 5

SERIAL我假设 PostgreSQL...

CREATE TABLE formula_relation (
  formula_relation_id SERIAL PRIMARY KEY,
  formula1_id INT REFERENCES formulas (formula_id) ON DELETE CASCADE,
  formula2_id INT REFERENCES formulas (formula_id) ON DELETE CASCADE,
  CHECK (formula1_id < formula2_id)
);
Run Code Online (Sandbox Code Playgroud)

SQLFiddle

(我还假设您的关系是对称的,因此i与 相关A[i]A[i]意味着与 相关i;因此,formula1_id < formula2_id确保该行只能有一个规范的变体,并且您不需要检查反向配对。如果关系不对称,您应该只是CHECK (formula1_id != formula2_id)。)