在关系数据库设计中,有一个数据库规范化或简称规范化的概念,即对列(属性)和表(关系)进行组织的过程,以减少数据冗余,提高数据完整性。(如维基百科上所写)。
由于大多数文章都有些技术性,因此更难理解,我要求有人根据关于 1NF、2NF、3NF 甚至 3.5NF(Boyce-Codd)含义的示例写一个更易于理解的解释。
在关系数据库设计中,有一个数据库规范化或简称规范化的概念,即对列(属性)和表(关系)进行组织的过程,以减少数据冗余,提高数据完整性。(如维基百科上所写)。
由于大多数文章都有些技术性,因此更难理解,我要求有人根据关于 1NF、2NF、3NF 甚至 3.5NF(Boyce-Codd)含义的示例写一个更易于理解的解释。
1NF是最基本的范式——表格中的每个单元格必须只包含一条信息,并且不能有重复的行。
2NF 和 3NF 都是关于依赖于主键的。回想一下,一个主键可以由多个列组成。正如克里斯在回复中所说:
数据取决于密钥 [1NF]、整个密钥 [2NF] 以及密钥 [3NF](所以请帮帮我Codd)。
假设您有一个包含某个学期所学课程的表格,并且您有以下数据:
|-----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 是 ENTIRE 键。
Primary Key |
CourseID | Course Name |
---------------------------|
IT101 | Programming |
IT102 | Databases |
IT103 | Web Design |
没有冗余!
好的,假设我们还将课程老师的姓名以及有关他们的一些详细信息添加到 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:表中的每一列仅与表的键相关——表中的列不会描述表中不是键的另一列。
更多详细信息,请参阅维基百科...