database - 同一张表中的多对多关系?

标签 database postgresql database-design many-to-many

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

在我的例子中,我有一个公式表,我想说表中的两个公式是相关的:

公式表:

formula_id SERIAL PRIMARY KEY
name TEXT NOT NULL
formula TEXT NOT NULL

我假设我会创建一个名为 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

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

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

最佳答案

来自 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)
);

SQLFiddle

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

关于database - 同一张表中的多对多关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32085175/

相关文章:

sql - 将数据合并在一列中是错误的吗?

node.js - 如何增加 Mongoose 中子文档的属性?

sql - 基于用户的数据访问

Postgresql plpgsql函数语法错误

java - 我想使用 Java 字符串数组循环在 SQLite 中创建多个表。编程不好?

php - Mysql - 如何在 1 条记录中加入自定义字段标题和数据的表

MySql 表结构/性能

java - DBUnit 当前线程被中断

PostgreSQL:如何将 IPv6 网络地址分成两半

mysql - 是否可以有一个表链接到一个使用外键链接回第一个表的表?