https://dba.stackexchange.com/questions/98427/normilsation-2nf-and-3nf
我已经完成了几个问题和youtube教程;我知道2NF正在删除部分依赖关系,而3NF是可传递的依赖关系,但是我无法理解以下示例在2NF中应该是什么样子。
studentID | studentName | courseCode | courseTitle | modCode | modTitle |学分| resultCode为
我对2NF的尝试如下:
学生
studentID | studentName | courseCode | modCode | resultCode为
课程
courseCode | courseTitle
模块
modCode | modTitle |币
这是对的吗?如果没有,我哪里出错,为什么。
以下是3NF:
学生
studentID | studentName | courseCode
课程
courseCode | courseTitle
模块
modCode | modTitle |学分| courseCode
结果
studentID | modCode | resultCode为
同样如此;这是正确的 - 如果不是在哪里以及为什么?
答案 0 :(得分:0)
好的,让我们来看看你的2NF尝试:
<强>学生强>
studentID | studentName | courseCode | modCode | resultCode为
<强>课程强>
courseCode | courseTitle
<强>模块强>
modCode | modTitle |币
首先谈谈学生。
您的密钥不能是studentID,因为resultCode依赖于studentID和courseCode(每个课程都有一个结果)。但是您的studentName仅取决于studentID,因此是密钥的一部分(studentID,courseCode)。因此违反了2NF。你需要做这样的事情:
<强>学生强>
studentID | studentName | courseCode | MODCODE
<强>课程强>
courseCode | courseTitle
<强>模块强>
modCode | modTitle |币
<强>结果强>
studentID | courseCode | resultCode为
但请记住,这尊重2NF,但似乎仍然不正确,因为模块和课程现在完全不相关。所以试试这个:
<强>学生强>
studentID | studentName | MODCODE
<强>模块强>
modCode | modTitle |币
<强>课程强>
courseCode | courseTitle | MODCODE
<强>结果强>
studentID | courseCode | resultCode为
一个课程属于一个模块(一个模块有很多课程) - 从我的角度来看。这是自动的2NF(因为键总是只有一个属性(结果除外,但只有一个非键属性总是依赖于两个键属性),所以没有什么可以依赖于&#34;部分&# 34;关键)。它也在3NF,因为每个&#34;物理&#34;实体在数据模型中具有它的逻辑表示(更多的是经验法则而不是形式主义)。
现在让我们来看看你的3NF尝试。我认为你的模块&lt; - &gt;课程依赖是错误的,但我们只关注规范化。
<强>学生强>
studentID | studentName | courseCode
<强>课程强>
courseCode | courseTitle
<强>模块强>
modCode | modTitle |学分| courseCode
<强>结果
studentID | modCode | resultCode为
这是正确的3NF,因为除 键本身之外根本没有其他关键候选者。因此,不能存在任何传递依赖。
澄清这一点:关键候选者是许多可能键的最小集合之一。在你的关系中,你找到了至少一个具有一个元素的关键候选者(结果关系除外)。所以任何其他关键候选者都不能有多个元素。这意味着,您可以简单地查看每个属性并决定是否可以将其作为关键字?&#34;在您的示例中,您发现没有其他属性可以成为密钥 - 因此它自动在2NF和3NF中。