在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_Id
和 P_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));
我有一个数据库,其中包含一个名为 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_Id
和 P_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));