在关系型数据库设计中,有一个数据库规范化或简称规范化的概念,即对列(属性)和表(关系)进行组织的过程,以减少数据冗余,提高数据完整性。(如维基百科上所写)。
由于大多数文章都有些技术性,因此更难理解,我要求有人根据关于 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 中。所以每一个额外的范式都需要低范式所具有的 一切 ,加上一些额外的条件,这些 都 必须满足。