如果您知道此示例已解决的任何链接,请分享。
答案 0 :(得分:1)
Boyce-Codd要求具有3个NF(正常形式)的表,并且主键之间没有依赖关系(功能依赖性 - FD)。你首先需要评估1NF,2NF,3NF以及3FN Boyce-Codd。
对于1NF,必须应用一些规则
1NF :列中没有多值值
1NF :没有重复的行
还有其他规则,但与示例无关。
在您的表中没有重复的行。每个单元格只有一个值。该表格为第一范式。不需要改造。
2NF :部分PK和其他没有PK列之间没有任何关系。例如,如果PK有两列,我们必须检查PK的一列与不在Pk集中的其他列之间是否存在功能依赖。
如果主键只有一列(不是这种情况),则表格为2NF。由于主键有两列(属性),因此必须检查不属于PK的列是否与不属于PK的列相关(功能依赖性)
检查FD部分PK Stud_id
Stud_id - >专业名称?如果我知道stud_id字段,我也知道学生姓名?对于表中的值,这是正确的。对于列Stud_id的给定值,仅为stud_name
确定一个值Stud_id - >课程名称?这种功能依赖性并非如此。如果我得到Stud_id 224,则会有多个不同的值与此值相关联:Intro CIS,Database Mgt ...
Stud_id - >讲师?这种功能依赖也是错误的。如果我得到Stud_id 224,不止一个不同的教练确定:( Greene,Hong,Purao)
Stud_id - >办公室?这种功能依赖是错误的。如果我得到了Stud_id 224,确定了多个不同的办公室:(CBA001,CBA908,CBA700)
Stud_id - >房间?这种功能依赖是错误的。如果我得到了Stud_id 224,确定了多个不同的房间
Stud_id - >房间?这种功能依赖是错误的。对于值224,它是正确的但对于值stud_id 351,有两个可能的值(3,5)
主键列course_id需要相同的推理。
检查部分PK Course_id
Course_id - >学生姓名? FALSE(无功能依赖(FD))
Course_id - >课程名称? TRUE(FD)
Course_id - >讲师? TRUE(FD)
Course_id - >办公室? TRUE(FD)
Course_id - >房间? TRUE(FD)
Course_id - >信用? TRUE(FD)
对于2NF,每个FD需要一个表
学生 {Stud_ID(PK),Stud_Name}
COURSE-NAME {Course_ID(PK),course_name,讲师,办公室,房间,信用卡}
学生课程 {Stud_ID(PK),Course_ID(PK)}
每个新生成的表的PK始终是 - >左侧的列。当我们检查FD时。
对于每个新表,我们必须检查它们是否在2NF(要归档2NF,必须首先检查1FN)。因为STUDENT和COURSE表的所有主键都很简单(一列),而在STUDENT-COURSE中,所有列都是PK,所有表都在2NF中;我们只需删除重复的行(如果有的话)。
要归档Boyce-Codd,我们需要检查3NF。此表单检查非PK和候选列的列之间的依赖关系。
COURSE {Course_ID(PK),course_name,讲师,办公室,房间,信用卡}
课程表有重复的行。我们首先要删除它们。完成此过程后,表格为2NF,,因为所有具有简单PK(仅有一列为PK)的表都在2NF 中。因为它有多个不是PK的列,我们需要检查它们之间是否存在关系(FD)。
course_name;删除重复的行后,此列是候选键。我们不要查看此栏目。
必须检查讲师列,因为这不是PK和候选键的一部分。
讲师 - > course_name :没有FD
讲师 - >房间:没有FD
讲师 - >办公室:FD
讲师 - >信用:没有FD
因为教师和办公室之间有FD,所以必须创建一个新表来存储这些值。
INSTRUCTOR-OFFICE {讲师(PK),办公室}
COURSE {Course_ID(PK),course_name,讲师,房间,信用卡}
INSTRUCTOR-OFFICE表只有一个PK列,另一列不是PK。它以博伊斯 - 科德的形式出现。
对于新表COURSE,我们必须检查非PK列之间的FD。
房间 - >信用:DF
COURSE {Course_ID(PK),course_name,讲师,房间}
ROOM {room(PK),credit}
学生课程:它只有PK专栏。它在3FN。 (仅删除重复的行以存档1NF)
学生:只有一列不是PK(Stud_Name)。它位于 3FN,因为只有一列。。 (仅删除重复的行以存档1NF)
在此过程之后,我们列出了以下表格及其列:
学生 {Stud_ID(PK),Stud_Name}:简单PK,只有一个属性不是PK => 3FN Boyce-Codd
ROOM {room(PK),credit}
INSTRUCTOR-OFFICE {讲师(PK),办公室}
学生课程 {Stud_ID(PK),Course_ID(PK)}
COURSE {Course_ID(PK),course_name(CC),讲师,房间}(CC =候选人密钥)
讲师 - >房间:没有FD 房间 - >指导员:FD
必须为房间讲师列依赖关系生成新表。我们在教室里的房间栏目。我们必须在此表中添加新列指导器。
ROOM {room(PK),credit,instructor}
COURSE {Course_ID(PK),course_name(CC),room}
当前表:
学生 {Stud_ID(PK),Stud_Name}:简单PK,只有一个属性不是PK => 3FN Boyce-Codd
ROOM {room(PK),credit,instructor}:简单的PK和Credit NOT DF与讲师,讲师NOT DF与credit => 3NF Boyce-Codd
INSTRUCTOR-OFFICE {讲师(PK),办公室}:简单PK,只有一个属性不是PK => 3FN Boyce-Codd
COURSE {Course_ID(PK),course_name(CC),room}:一列PK,一列CC,一列也不是PK,也不是CC => 3FN Boyce-Codd
学生课程 {Stud_ID(PK),Course_ID(PK)}
要实现3NF Boyce-Codd,我们必须检查PK列之间没有功能依赖性。只能检查具有复合PK的表:在我们的例子中:
学生课程 {Stud_ID(PK),Course_ID(PK)}
Stud_ID - > Course_ID:没有FD
Couse_ID - > Stud_ID:没有FD
此表位于3NF Boyce-Codd。
如果不是FD的错误,最终的设置表是:
学生 {Stud_ID(PK),Stud_Name}
ROOM {room(PK),credit,instructor}
INSTRUCTOR-OFFICE {讲师(PK),办公室}
COURSE {Course_ID(PK),course_name(CC),room}
学生课程 {Stud_ID(PK),Course_ID(PK)}
Boyce-Codd流程的想法是删除表格中的数据冗余。目前的冗余仅适用于关系人员。 4FN和5FN也被定义,但通常不适用。
保持每个新表中的值以检查FD是个好主意:更多工作但更可靠。
我希望这有助于理解这个过程!
米克尔