什么是数据库常规表单,您能举例说明吗?

What are database normal forms and can you give examples?

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

由于大多数文章都是技术性的,因此很难理解,我希望有人根据1nf、2nf、3nf,甚至是3.5nf(boyce-codd)的含义,写一个更容易理解的解释。


1nf是最基本的正常形式-表中的每个单元格只能包含一条信息,并且不能有重复的行。

2nf和3nf都依赖于主键。回想一下,主键可以由多个列组成。正如克里斯在回复中所说:

数据依赖于键[1nf]、整个键[2nf]和键[3nf]之外的任何东西(所以请帮助我codd)。

2NF

假设您有一个表,其中包含在某个学期学习的课程,并且您有以下数据:

1
2
3
4
5
6
7
8
9
|-----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是整个键。

1
2
3
4
5
6
7
Primary Key |

CourseID    |  Course Name |
---------------------------|
IT101       | Programming  |
IT102       | Databases    |
IT103       | Web Design   |

没有冗余!

3NF

好吧,假设我们也在RDBMS中添加了课程老师的名字和一些关于他们的细节:

1
2
3
4
5
6
7
8
9
|-----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   |

现在希望很明显,老师的名字是依赖于老师的-所以这不是在3nf中。为了解决这个问题,我们和2nf中的方法差不多——将teachername字段从这个表中取出,并将其放入自己的表中,该表已经作为键进行了教学。

1
2
3
4
5
6
7
 Primary Key |

 TeacherID   | TeacherName  |
 ---------------------------|
 332         |  Mr Jones    |
 495         |  Mr Bentley  |
 242         |  Mrs Smith   |

没有冗余!!

要记住的一件重要事情是,如果某个东西不在1nF中,它也不在2nF或3nF中。所以每一个附加的正规形式都需要低正规形式所拥有的一切,加上一些附加的条件,这些条件都必须被满足。


我从来没有对准确的措辞有过良好的记忆,但在我的数据库课上,我认为教授总是说一些类似的话:

The data depends on the key [1NF], the whole key [2NF] and nothing but the key [3NF].


这里有一个快速的,公认的被屠杀的反应,但在一句话中:

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

2nf:由于另一列的存在,您不会在表的一列中重复数据。

3nf:表中的每一列都只与表的键相关——表中没有描述表中另一列而不是键的列。

有关详细信息,请参阅维基百科…


1nf:每列仅一个值

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

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

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