在关系数据库设计中,有一个数据库规范化或者简称规范化的概念,它是组织列(属性)和表(关系)以减少数据冗余并提高数据完整性的过程。 维基百科
基于 1NF、2NF、3NF 和 3.5NF (Boyce-Codd BCNF) 含义的示例解释是什么?
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 是整个键。
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,而 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:表中的每一列仅与表的键相关——表中不会有一列描述表中不是键的另一列。
有关更多详细信息,请参阅维基百科...