第三范式 (3NF)

Third Normal Form (3NF)

伙计们,我有这两个表,如果我想确保它们在 3NF 中,这是正确的方法吗?

我还可以知道带下划线但也用星号表示的主键的用途,这背后的原因是什么?

Table

我的回答

第三范式

StaffDetails(StaffID,SName,DOB,DivisionNo*)

部门(部门编号,DivName,DivSupervisorID)

StaffProject(StaffId*, ProjectNo*,SName, ProjectName,HoursAssigned)

项目(项目编号,项目名称)

请假设加粗的属性是下划线。非常感谢。

不,当您在 StaffProject table.

中复制 SNameStaffProject 时,它不完全是 3NF

table可能应该是:

员工详情

Column Data Type Constraints
StaffDetails VARCHAR2 Primary Key
SName VARCHAR2
DOB DATE
DivisionNo INT Foreign Key(Division)

Column Data Type Constraints
DivisionNo INT Primary Key
DivName VARCHAR2 (Probably Unique)
DivSupervisorID VARCHAR2 Foreign Key(StaffDetails)

员工项目

Column Data Type Constraints
StaffID VARCHAR2 Composite Primary Key, Foreign Key(StaffDetails)
ProjectNo VARCHAR2 Composite Primary Key, Foreign Key(Project)
HoursAssigned NUMBER Check > 0

项目

Column Data Type Constraints
ProjectNo INT Primary Key
ProjectName VARCHAR2 (Probably unique)

至于你的符号问题,这是你的导师似乎使用的惯例,但不一定是全球公认的,所以你最好问他们;然而,主键似乎带有下划线,外键旁边有一个星号。

StaffProject 会有既是复合主键又是外键的列,因此会有两种表示法。

table 的主键上的一列或多列也可以是另一个的外键。

在你的例子中似乎是:

  • (StaffId, ProjectNo) 是StaffProject的PK。
  • StaffId 也是 对 table StaffDetails 的 FK;这就是它带有星号的原因。
  • ProjectNo 也是 对 table Project 的 FK;这就是为什么它本身有一个星号。

如果您希望您的模型是 3NF,您需要删除额外的依赖项:

  • 在这种情况下,DivNameDivSupervisorID 是多余的,应从 table StaffDetail.
  • 中删除
  • ProjectNameSNameStaffProject中也是多余的。您必须删除它们以使模型符合 3NF。