在关系数据库设计中,有一个数据库归一化或简单归一化的概念,这是一个组织列(属性)和表(关系)以减少数据冗余和提高数据完整性的过程。维基百科
举例说明1NF、2NF、3NF和3.5NF(博伊斯-科德BCNF)是什么意思?
在关系数据库设计中,有一个数据库归一化或简单归一化的概念,这是一个组织列(属性)和表(关系)以减少数据冗余和提高数据完整性的过程。维基百科
举例说明1NF、2NF、3NF和3.5NF(博伊斯-科德BCNF)是什么意思?
当前回答
1NF是最基本的标准表单——表中的每个单元格必须只包含一条信息,并且不能有重复的行。
2NF和3NF都依赖于主键。回想一下,一个主键可以由多个列组成。正如克里斯在他的回答中所说:
数据依赖于键[1NF],整个键[2NF]和除键[3NF]以外的任何东西(帮助我Codd)。
2NF
假设您有一个表,其中包含某个学期的课程,并且您有以下数据:
|-----Primary Key----| uh oh |
V
CourseID | SemesterID | #Places | Course Name |
------------------------------------------------|
IT101 | 2009-1 | 100 | Programming |
IT101 | 2009-2 | 100 | Programming |
IT102 | 2009-1 | 200 | Databases |
IT102 | 2010-1 | 150 | Databases |
IT103 | 2009-2 | 120 | Web Design |
这不是在2NF中,因为第四列并不依赖于整个键——而只是它的一部分。课程名称依赖于课程的ID,但与所选学期无关。因此,如您所见,我们有重复的信息——几行告诉我们IT101正在编程,而IT102是数据库。因此,我们通过将课程名称移动到另一个表中来解决这个问题,其中CourseID是whole键。
Primary Key |
CourseID | Course Name |
---------------------------|
IT101 | Programming |
IT102 | Databases |
IT103 | Web Design |
没有冗余!
3NF
好的,假设我们还添加了课程老师的名字,以及他们的一些细节,到RDBMS中:
|-----Primary Key----| uh oh |
V
Course | Semester | #Places | TeacherID | TeacherName |
---------------------------------------------------------------|
IT101 | 2009-1 | 100 | 332 | Mr Jones |
IT101 | 2009-2 | 100 | 332 | Mr Jones |
IT102 | 2009-1 | 200 | 495 | Mr Bentley |
IT102 | 2010-1 | 150 | 332 | Mr Jones |
IT103 | 2009-2 | 120 | 242 | Mrs Smith |
现在希望大家能清楚地看到,TeacherName依赖于TeacherID——所以这不是在3NF中。为了解决这个问题,我们做了与在2NF中所做的大致相同的事情——从这个表中取出TeacherName字段,并将其放在自己的表中,其中以TeacherID为键。
Primary Key |
TeacherID | TeacherName |
---------------------------|
332 | Mr Jones |
495 | Mr Bentley |
242 | Mrs Smith |
没有冗余!
要记住的一件重要的事情是,如果某样东西不在1NF中,那么它也不在2NF或3NF中。所以每一个额外的标准形式都需要低级标准形式所具备的一切,再加上一些额外的条件,这些条件都必须满足。
其他回答
以下是一个简短的回答,当然是粗鄙的回答,但就是一句话:
1NF:你的表被组织成一个无序的数据集,没有重复的列。
2NF:你不会因为另一列而重复表中某一列的数据。
3NF:你的表中的每一列都只与你的表的键相关——你不会让一个表中的列描述你的表中的另一个不是键的列。
要了解更多细节,请参阅维基百科。
1NF:每列只有一个值
2NF:表中的所有非主键列都应该依赖于整个主键。
3NF:表中的所有非主键列都应该直接依赖于整个主键。
我在这里写了一篇更详细的文章
我从来没有一个很好的记忆准确的措辞,但在我的数据库课上,我想教授总是这样说:
数据依赖于密钥[1NF],整个密钥[2NF]和密钥[3NF]。
1NF是最基本的标准表单——表中的每个单元格必须只包含一条信息,并且不能有重复的行。
2NF和3NF都依赖于主键。回想一下,一个主键可以由多个列组成。正如克里斯在他的回答中所说:
数据依赖于键[1NF],整个键[2NF]和除键[3NF]以外的任何东西(帮助我Codd)。
2NF
假设您有一个表,其中包含某个学期的课程,并且您有以下数据:
|-----Primary Key----| uh oh |
V
CourseID | SemesterID | #Places | Course Name |
------------------------------------------------|
IT101 | 2009-1 | 100 | Programming |
IT101 | 2009-2 | 100 | Programming |
IT102 | 2009-1 | 200 | Databases |
IT102 | 2010-1 | 150 | Databases |
IT103 | 2009-2 | 120 | Web Design |
这不是在2NF中,因为第四列并不依赖于整个键——而只是它的一部分。课程名称依赖于课程的ID,但与所选学期无关。因此,如您所见,我们有重复的信息——几行告诉我们IT101正在编程,而IT102是数据库。因此,我们通过将课程名称移动到另一个表中来解决这个问题,其中CourseID是whole键。
Primary Key |
CourseID | Course Name |
---------------------------|
IT101 | Programming |
IT102 | Databases |
IT103 | Web Design |
没有冗余!
3NF
好的,假设我们还添加了课程老师的名字,以及他们的一些细节,到RDBMS中:
|-----Primary Key----| uh oh |
V
Course | Semester | #Places | TeacherID | TeacherName |
---------------------------------------------------------------|
IT101 | 2009-1 | 100 | 332 | Mr Jones |
IT101 | 2009-2 | 100 | 332 | Mr Jones |
IT102 | 2009-1 | 200 | 495 | Mr Bentley |
IT102 | 2010-1 | 150 | 332 | Mr Jones |
IT103 | 2009-2 | 120 | 242 | Mrs Smith |
现在希望大家能清楚地看到,TeacherName依赖于TeacherID——所以这不是在3NF中。为了解决这个问题,我们做了与在2NF中所做的大致相同的事情——从这个表中取出TeacherName字段,并将其放在自己的表中,其中以TeacherID为键。
Primary Key |
TeacherID | TeacherName |
---------------------------|
332 | Mr Jones |
495 | Mr Bentley |
242 | Mrs Smith |
没有冗余!
要记住的一件重要的事情是,如果某样东西不在1NF中,那么它也不在2NF或3NF中。所以每一个额外的标准形式都需要低级标准形式所具备的一切,再加上一些额外的条件,这些条件都必须满足。