关联表中的复合键

时间:2015-04-12 02:51:57

标签: sql database

我知道对于关联实体,来自相邻实体的唯一标识符必须包含在关联实体中以具有PK-FK约束。我们在SQL DDL命令中创建PK-FK密钥与其各自邻居之间的约束。

但是,在创建SQL DDL命令时,我们是否还必须为该关联表创建一个复合键(除了PK-FK键约束)?非常感谢帮助,谢谢。

1 个答案:

答案 0 :(得分:1)

我认为一个例子可以让你更清楚你要问的是什么,但如果我理解正确,你就会问一个带外键的实体是否必须包含外键在其主键(使其成为复合主键)?

这取决于你想要完成的事情,但答案通常是否定的。

  • 您正在使用代理键(而不是自然键),这意味着主键不是来自现实世界的值,而是一个任意唯一值,通常是一个整数序列。在下面的示例中,DBA构成了TeacherDepartment的唯一标识符,这些标识符在现实世界中不存在。

    CREATE TABLE Teacher
    (
      Teacher_ID int PRIMARY KEY, -- e.g., 000001
      Department_ID int FOREIGN KEY REFERENCES Department(Department_ID)
    );
    
    
    CREATE TABLE Department
    (
       Department_ID int PRIMARY KEY -- e.g., 000001
    );
    
  • 您使用的是自然键,但这两个实体可以相互独立存在。在下面的例子中,这意味着在现实世界中,教师可以被取消分配,而且部门可以没有教师。

    CREATE TABLE Teacher
    (
       Teacher_SSN int PRIMARY KEY,  -- social security number
       Department_Name VARCHAR(255) FOREIGN KEY REFERENCES Department(Department_Name)
    );
    
    CREATE TABLE Department
    (
       Department_Name VARCHAR(255) PRIMARY KEY
    );
    
  • 您正在使用自然键,业务规则使得关联实体需要父级才能存在,但它有自己的自然主键(由简单的NOT NULL约束强制执行外键)。这意味着如果没有相应的部门,部门经理就不能存在,但是部门没有定义其唯一身份。

    CREATE TABLE DepartmentManager
    (
       Manager_SSN int PRIMARY KEY,
       Department_Name VARCHAR(255) NOT NULL FOREIGN KEY REFERENCES Department(Department_ID)
    );
    
    CREATE TABLE Department
    (
       Department_ID VARCHAR(255) PRIMARY KEY
    );
    

  • 问题的业务规则或域是这样的:如果不使用父实体的主键作为关联实体的复合主键的一部分,则无法唯一地描述实体,并且您不要&# 39;我想使用代理键。在下面的示例中,房间号为" 001"可能存在多次,因为有多个建筑物的房间标有" 001",但如果我们在复合主键中包含建筑物的名称,那么我们就有一个唯一的标识符。在这种情况下,Room称为弱实体Building强实体。 (More on that here.

    CREATE TABLE Room
    (
       Room_Number int,
       Building_Name VARCHAR(255) FOREIGN KEY REFERENCES Building(Building_Name),
       CONSTRAINT pk_Room PRIMARY KEY (Room_Number,Building_Name)
    );
    
    CREATE TABLE Building
    (
       Building_Name VARCHAR(255) PRIMARY KEY
    );