【问题标题】: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_Id 和 P_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));