代码之家  ›  专栏  ›  技术社区  ›  user8950166

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

  •  0
  • user8950166  · 技术社区  · 7 年前

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

    table U
      U_Id primary key.
    
    table P
    P_Id primary key
    

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

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

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

    (U\U id和P\U id作为外键)

     Third_Table
    
     U_id FK not null
    
     P_Id FK  not null
    

    有什么更好的选择?

    3 回复  |  直到 7 年前
        1
  •  2
  •   reaanb    7 年前

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

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

        2
  •  0
  •   James K. Lowden    7 年前

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

    这是您需要的引用完整性,否则第三个表可能具有不引用任何内容的值。(欢呼) 多多少少 行!)

    1) 创建包含复合主键(U\U Id,P\U Id)的新表

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

    主键是唯一约束的一种形式。如果一个表有多个唯一约束,则可以任意选择调用主键的约束。然而,就你而言,只有一个。

    您需要对第三个表进行某种独特的约束,以防止重复行。 Primary Key (U_Id,P_Id) 比任何人都说 {U_Id,P_Id} 配对是唯一的,并确定了这种关系。从你所说的,这就是你想要的。

        3
  •  0
  •   nvogel    7 年前

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

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