【发布时间】:2015-04-12 02:51:56
【问题描述】:
我知道对于关联实体,来自相邻实体的唯一标识符必须包含在关联实体中才能具有 PK-FK 约束。我们在 SQL DDL 命令中创建 PK-FK 键与它们各自的邻居之间的约束。
但是,在创建 SQL DDL 命令时,我们是否还必须为该关联表创建一个复合键(除了 PK-FK 键约束)?非常感谢帮助,谢谢。
【问题讨论】:
-
我认为您不必这样做,除非您需要确保对象之间关系的唯一性。
我知道对于关联实体,来自相邻实体的唯一标识符必须包含在关联实体中才能具有 PK-FK 约束。我们在 SQL DDL 命令中创建 PK-FK 键与它们各自的邻居之间的约束。
但是,在创建 SQL DDL 命令时,我们是否还必须为该关联表创建一个复合键(除了 PK-FK 键约束)?非常感谢帮助,谢谢。
【问题讨论】:
我认为一个示例会使您的要求更清楚一些,但是如果我理解正确,您是在询问具有外键的实体是否必须在其主键中包含外键(使其成为复合主键)?
这取决于您要完成的任务,但答案通常是否定的。
否
您正在使用代理键(与自然键相反),这意味着主键不是来自现实世界的值,而是任意唯一值,通常是整数序列。在下面的示例中,DBA 为 Teacher 和 Department 组成了现实世界中不存在的唯一标识符。
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
);
是的
问题的业务规则或领域是这样的,如果不使用父实体的主键作为关联实体的复合主键的一部分,就无法唯一地描述实体,并且您不想使用代理键.在下面的示例中,一个房间号“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
);
【讨论】: