第三范式 (3NF)
Third Normal Form (3NF)
伙计们,我有这两个表,如果我想确保它们在 3NF 中,这是正确的方法吗?
我还可以知道带下划线但也用星号表示的主键的用途,这背后的原因是什么?
Table
我的回答
第三范式
StaffDetails(StaffID,SName,DOB,DivisionNo*)
部门(部门编号,DivName,DivSupervisorID)
StaffProject(StaffId*, ProjectNo*,SName, ProjectName,HoursAssigned)
项目(项目编号,项目名称)
请假设加粗的属性是下划线。非常感谢。
不,当您在 StaffProject
table.
中复制 SName
和 StaffProject
时,它不完全是 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,您需要删除额外的依赖项:
- 在这种情况下,
DivName
和 DivSupervisorID
是多余的,应从 table StaffDetail
. 中删除
ProjectName
和SName
在StaffProject
中也是多余的。您必须删除它们以使模型符合 3NF。
伙计们,我有这两个表,如果我想确保它们在 3NF 中,这是正确的方法吗?
我还可以知道带下划线但也用星号表示的主键的用途,这背后的原因是什么?
Table
我的回答
第三范式
StaffDetails(StaffID,SName,DOB,DivisionNo*)
部门(部门编号,DivName,DivSupervisorID)
StaffProject(StaffId*, ProjectNo*,SName, ProjectName,HoursAssigned)
项目(项目编号,项目名称)
请假设加粗的属性是下划线。非常感谢。
不,当您在 StaffProject
table.
SName
和 StaffProject
时,它不完全是 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
是 也是 对 tableStaffDetails
的 FK;这就是它带有星号的原因。ProjectNo
是 也是 对 tableProject
的 FK;这就是为什么它本身有一个星号。
如果您希望您的模型是 3NF,您需要删除额外的依赖项:
- 在这种情况下,
DivName
和DivSupervisorID
是多余的,应从 tableStaffDetail
. 中删除
ProjectName
和SName
在StaffProject
中也是多余的。您必须删除它们以使模型符合 3NF。