如何将这张桌子逐步归化为Boyce Codd

时间:2017-05-24 16:32:33

标签: sql database database-normalization

here is the Table

如果您知道此示例已解决的任何链接,请分享。

1 个答案:

答案 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是个好主意:更多工作但更可靠。

我希望这有助于理解这个过程!

米克尔