【问题标题】:In M:N database relationship it's better to reference by a composite PK or two foreign keys在 M:N 数据库关系中,最好通过复合 PK 或两个外键来引用
【发布时间】:2017-11-23 14:31:08
【问题描述】:

我有一个数据库,其中包含一个名为 U 的表和一个名为 P 的表。

table U
  U_Id primary key.

table P
P_Id primary key

两个表之间存在多对多关系。

我有两种方法来创建两个表之间的关系:

1)创建一个包含复合主键(U_Id,P_Id)的新表

2) 创建一个新表,其中包含来自 U 表和 P 表的引用作为外键。

(U_id和P_id作为外键)

 Third_Table

 U_id FK not null

 P_Id FK  not null

什么更好的选择?

【问题讨论】:

标签: mysql database database-design database-administration


【解决方案1】:

选项 1 和 2 不反对。您的关系表将包含 U_IdP_Id 作为外键,如果不是主键,这两列的组合至少应标记为唯一键。

一些数据库设计者更喜欢引入代理标识符作为主键。其他人(包括我自己)更喜欢使用外键组合作为主键。

【讨论】:

    【解决方案2】:

    2) 创建一个新表,其中包含来自 U 表和 P 表的引用作为外键。

    您需要参照完整性,否则第三个表可能具有不引用任何内容的值。 (为 many-to-nothing 行欢呼!)

    1) 创建一个包含复合主键(U_Id,P_Id)的新表

    如果不这样做,第三张表的主键是什么?它会有一个,对吧?

    主键是唯一约束的一种形式。如果一个表有多个唯一约束,那么选择哪一个来调用主键是任意的。不过,就你而言,只有一个。

    您需要在第三张表上设置某种唯一约束以防止重复行。 Primary Key (U_Id,P_Id) 表示比任何 {U_Id,P_Id} 对都是唯一的,并标识该关系。从你所说的,这就是你想要的。

    【讨论】:

      【解决方案3】:

      我希望复合键由两个外键组成。示例代码(未经测试):

      CREATE TABLE Q
      (u_id INT NOT NULL FOREIGN KEY REFERENCES U (u_id),
      p_id INT NOT NULL FOREIGN KEY REFERENCES P (u_id),
      PRIMARY KEY (u_id, pi_id));
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-10-06
        • 2017-09-15
        • 1970-01-01
        • 1970-01-01
        • 2011-05-26
        • 1970-01-01
        • 2018-09-14
        相关资源
        最近更新 更多