gpt4 book ai didi

sql - 如何将复合 PK 引用为另一个表中的外键并仍然具有规范化数据库?

转载 作者:行者123 更新时间:2023-12-02 00:03:33 27 4
gpt4 key购买 nike

首先,这是我遇到问题的三个表的代码:

    CREATE TABLE ProgramSupervisor
( EmpNo CHAR (6),
ProgramSupervisorNo CHAR (6),
TeamNo CHAR (3),
CONSTRAINT PKProgramSupervisor PRIMARY KEY (EmpNo , ProgramSupervisorNo) ,
CONSTRAINT FKProgSupEmpNo FOREIGN KEY (EmpNo) REFERENCES Employee )

另一个:

    CREATE TABLE ISL
( ISLNo CHAR (6) ,
EmpNo CHAR(6),
ProgramSupervisorNo CHAR (6),
ISLName VARCHAR (30),
ISLStreet VARCHAR (40),
ISLCity VARCHAR (30),
ISLState CHAR (2),
ISLZip CHAR (5),
CONSTRAINT PKISL PRIMARY KEY (ISLNo) ,
CONSTRAINT FKISLProgSupNo FOREIGN KEY (ProgramSupervisorNo, EmpNo)
REFERENCES ProgramSupervisor )

还有一个:

    CREATE TABLE Hourly
( EmpNo CHAR (6),
ISLNo CHAR (3),
NumberOfWriteUpes SMALLINT,
CONSTRAINT PKHourly PRIMARY KEY (EmpNo),
CONSTRAINT FKEmpNo FOREIGN KEY (EmpNo) REFERENCES Employee,
CONSTRAINT FKISLNo FOREIGN KEY (ISLNo) REFERENCES ISL )

这是我努力争取的 ERD 和关系:

enter image description here

现在您已经了解了信息,让我解释一下我遇到的问题。首先,ERD 有点误导。我有一个 ProgramSupervisor 表,它是“薪水”父表的子表,而“薪水”是父表“雇员”的子表。 Employee的PK是EmpNo,Salary和ProgramSupervisor的PK也是EmpNo。但是,我还希望 ProgramSupervisorNo 成为“ProgramSupervisor”表的 PK,并为其创建一个复合 PK。当我创建“ISL”表时,为了在 ISL 表中将复合“ProgramSupervisor”PK 引用为 FK,Access 需要两个 PK 字段名称。这不违反规范化标准吗?由于它需要“ISL”表中的 EmpNo 和 ProgramSupervisorNo,这是否意味着 ProgramSupervisorNo 依赖于 EmpNo,因此不应包含其中一个字段?我是新手,所以请原谅我的拙劣解释。

此外,'Hourly' 员工属于一个 ISL,ISL 可以有多个 'Hourly' 员工,但 'Hourly' 表也是 Employee 的子表,并且以 EmpNo 作为其主键。也就是说,如果我需要将 EmpNo 和 ProgramSupervisorNo 放入我的“ISL”表中,我该如何将 ISLNo 放入我的“每小时”表中?

一尘不染?基本上,我只是将 ProgramSupervisorNo 放入“ISL”表中,因为每个 ISL 都有一个 ProgramSupervisor。然后,我想将 ISLNo 放入我的“每小时”表中。请提供一些示例并像我五岁一样向我解释。任何帮助深表感谢。

最佳答案

从学术的角度来看,Primary key 必须满足所有这些要点:

  • 独一无二
  • 最小
  • 所有 PK 字段都是非空的

外键是对其他表主键的引用。因此它们必须准确地包括引用的 PK 所具有的字段。这并不违反归一化,因为 PK 必须是最小的(从学术角度来看)。

当您有一个包含 2 列或更多列的主键,并且您认为只用一列来引用它的行就足够了,那么您的主键无效,因为它不是最小的。当它有效并且您需要所有这些列来填充唯一性时,您还需要外键中的所有这些列。

DBMS 允许您定义非最小 PK,但这就是您离开学术概念的地方。

关于sql - 如何将复合 PK 引用为另一个表中的外键并仍然具有规范化数据库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19895805/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com