在M:N 数据库关系中,最好通过复合PK 或两个外键来引用

In M:N database relationship it's better to reference by a composite PK or two foreign keys

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

table U
  U_Id primary key.

table P
P_Id primary key

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

我有两种方法来创建两者之间的关系table:

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

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

(U_id 和 P_id 作为外键)

 Third_Table

 U_id FK not null

 P_Id FK  not null

有什么更好的选择?

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

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

2) create a new table that contains references from U table and P table as foreign keys.

您需要引用完整性,否则第 3 个 table 可能具有不引用任何内容的值。 (为 从多到无 行欢呼!)

1) create a new table that contains a composite Primary Key (U_Id,P_Id)

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

主键是唯一约束的一种形式。如果 table 有多个唯一约束,则选择哪一个作为主键是任意的。不过,在你的情况下,只有一个。

您需要对第 3 个 table 进行某种唯一约束以防止出现重复行。 Primary Key (U_Id,P_Id) 表示任何 {U_Id,P_Id} 对都是唯一的,并确定了这种关系。从你说的,这就是你想要的。

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

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