3

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

    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 和我正在努力争取的关系:

在此处输入图像描述

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

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

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

4

1 回答 1

3

从学术角度来看,Primary key必须符合所有这些要点:

  • 独特的
  • 最小的
  • 所有 PK 字段都是非空的

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

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

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

于 2013-11-10T22:22:15.483 回答