289

在关系数据库设计中,有一个数据库规范化或简称规范化的概念,即对列(属性)和表(关系)进行组织的过程,以减少数据冗余,提高数据完整性。(如维基百科上所写)。

由于大多数文章都有些技术性,因此更难理解,我要求有人根据关于 1NF、2NF、3NF 甚至 3.5NF(Boyce-Codd)含义的示例写一个更易于理解的解释。

4

4 回答 4

450

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 是 ENTIRE 键。

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 中。因此,每个额外的范式都需要较低范式所具有的所有内容,以及一些必须满足的额外条件。

于 2009-04-07T03:09:53.020 回答
128

我对确切的措辞从来没有很好的记忆,但在我的数据库课上,我认为教授总是说这样的话:

数据取决于密钥 [1NF]、整个密钥 [2NF] 以及密钥 [3NF]。

于 2009-04-07T02:53:01.187 回答
51

这是一个快速的,公认的屠杀回应,但在一句话中:

1NF:您的表被组织为一组无序的数据,并且没有重复的列。

2NF:您不会因为另一列而在表的一列中重复数据。

3NF:表中的每一列仅与表的键相关——表中的列不会描述表中不是键的另一列。

更多详细信息,请参阅维基百科...

于 2009-04-07T02:53:31.263 回答
38

1NF:每列只有一个值

2NF:表中的所有非主键列都应该依赖于整个主键。

3NF:表中的所有非主键列都应直接依赖于整个主键。

我在这里写了一篇更详细的文章

于 2012-10-22T22:28:41.710 回答