归一化 - 2NF 和 3NF

Normalization - 2NF and 3NF

https://dba.stackexchange.com/questions/98427/normilsation-2nf-and-3nf

我已经完成了几个问题和 youtube 教程;我知道 2NF 正在删除部分依赖关系,而 3NF 是传递依赖关系,但我无法理解以下示例在 2NF 中的样子。

学号 |学生姓名 |课程代码 |课程名称 |修改代码 |模组标题 |学分 |结果代码

我对 2NF 的尝试如下:

学生

学号 |学生姓名 |课程代码 |修改代码 |结果代码

课程

课程代码 |课程名称

模块

模组代码 |模组标题 |学分

这是正确的吗?如果不是,我哪里错了,为什么。


以下是3NF:

学生

学号 |学生姓名 |课程代码

课程

课程代码 |课程名称

模块

模组代码 |模组标题 |学分 |课程代码

结果

学号 |修改代码 |结果代码

同样如此;这是否正确 - 如果不正确,在何处以及为什么?

好的,让我们看看你的 2NF 尝试:

Student

studentID | studentName | courseCode | modCode | resultCode

Course

courseCode | courseTitle

Module

modCode | modTitle | credits

先说学生

您的密钥不能是studentID,因为resultCode 取决于studentID 和courseCode(每门课程都有一个结果)。但是您的 studentName 仅取决于 studentID,因此是键的一部分(studentID,courseCode)。所以 2NF 被违反了。你需要做这样的事情:

学生

学号 |学生姓名 |课程代码 |模组代码

课程

课程代码 |课程名称

模块

模组代码 |模组标题 |学分

结果

学号 |课程代码 |结果代码

但请记住,这符合 2NF,但似乎仍然不正确,因为模块和课程现在完全不相关。所以试试这个:

学生

学号 |学生姓名 |模组代码

模块

模组代码 |模组标题 |学分

课程

课程代码 |课程名称 |模组代码

结果

学号 |课程代码 |结果代码

一个课程属于一个模块(一个模块有很多课程)——从我的角度来看。这在 2NF 中是自动的(因为键总是只有一个属性(除了结果,但是只有一个 non-key-attribute 总是依赖于两个键属性),所以没有什么可以依赖于键的“部分” ).它也在 3NF 中,因为每个“物理”实体在数据模型中都有它的逻辑表示(更多的是经验法则而不是形式主义)。


现在让我们看看您的 3NF 尝试。我认为您以错误的方式获得了模块<->课程依赖性,但我们只关注规范化。

Student

studentID | studentName | courseCode

Course

courseCode | courseTitle

Module

modCode | modTitle | credits | courseCode

Results

studentID | modCode | resultCode

这是正确的 3NF,因为除了 密钥本身,根本没有其他候选密钥。所以不能有任何传递依赖。

澄清一下:候选键是可能键的许多最小集合之一。在您的关系中,您至少找到了一个具有一个元素的关键候选者(结果关系除外)。所以任何其他关键候选者都不能有一个以上的元素。这意味着,您可以简单地查看每个属性并决定“这是否可以作为键?”在您的示例中,您发现没有其他属性可以作为键 - 因此它自动处于 2NF 和 3NF 中。