什么是数据库范式,您可以举一些例子吗?[关闭]


277

在关系数据库设计中,存在数据库规范化或简单规范化的概念,该概念是组织列(属性)和表(关系)以减少数据冗余并提高数据完整性的过程。(如Wikipedia所写)。

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

Answers:


435

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


9
只是从事物之间的关系来考虑。如果我问您“ ID为IT101的课程名称是什么?”,您可以给我答案,对吗?同样,如果我问您“哪个老师的ID 332?” 你可以告诉我那是什么老师。因此,课程名称取决于其ID。
Smashery 2009年

9
但是,您不能反过来-如果我要问您“琼斯先生的身份证是什么?” 您可能无法给出唯一的答案,因为可能有两名琼斯先生。因此,ID并不依赖于名称,而是依赖于ID的名称。
Smashery

2
您也可以这样想-查看下面的第三张桌子(其中第一张桌子带有TeacherName)。是什么阻止我在第一行显示“ Jones先生”,然后在第二行显示“ Blogggs先生”?我不应该被允许这样做,因为他们已经得到了双方的332的ID
Smashery

30
@instantsetsuna-完整说明:在一些法院中,询问证人是否会说“真相,全部真相,只有真相,所以请上帝帮助我”;因为在知道您是否在说真话时,上帝被认为是有权柄的人。对于数据库,我们可以说“数据取决于密钥,整个密钥,而仅取决于密钥,所以请帮我Codd”。泰德·科德(Ted Codd)是提出关系数据库概念的人-事物依赖于密钥等,因此在关系数据库的情况下,他将是权威。
Smashery 2010年

5
@Smashery 2NF和3NF有什么区别?
Zo

119

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

数据取决于密钥[1NF],整个密钥[2NF]和仅密钥[3NF]。


72
...所以帮我科德。en.wikipedia.org/wiki/Ted_Codd
Smashery

6
那么两者之间有什么区别The data depends on the key [1NF], nothing but the key [3NF]呢?请不要混淆我们,因为1个SENSENSE答案并不能阐明答案,但会混淆访客!
Pratik 2015年

2
“表中的每个单元格只能包含一条信息,并且不能有重复的行。” -我看不到“数据取决于键”如何匹配所有这些。
西蒙·福斯伯格

46

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

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

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

3NF:表中的每一列都只与表的键相关-表中没有列来描述表中不是键的另一列。

有关更多详细信息,请参见Wikipedia...。


1
据我所知,1NF的避开的重复并不是指重复列,而是单代表为同一属性重复值的任意数量的,即不是原子。I类基础上这例如(1)stackoverflow.com/questions/23194292/... /(2)stackoverflow.com/questions/26357276/...
underscore_d

34

1NF:每列仅一个值

2NF:表中的所有非主键列均应取决于整个主键。

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

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


因为您未提供归因。我已经编辑了答案以提供出处。
罗伯特·哈维

尽可能将示例包含在答案中。临时用户应该能够阅读您的答案并从中获得一些价值,而无需单击博客链接。换句话说,答案应该是独立的。
罗伯特·哈维

我会牢记这一点。谢谢您:)
Arcturus 2012年

3
还要注意,这个问题已经有两年历史了,已经有一个被高度评价的答案,被OP标记为接受。社区会更仔细地审查后期答案,以评估它们是否为OP增加了真正的附加价值。
罗伯特·哈维

3
@Arcturus通读了这篇文章,仍然是那里标准化的更好的解释之一。
Olian04年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.