在关系数据库设计中,有一个数据库规范化或简单规范化的概念,即组织列(属性)和表(关系)以减少数据冗余并提高数据完整性的过程.(如第Wikipedia页所述).
由于大多数文章都有一定的技术性,因此更难理解,我要求有人根据1NF、2NF、3NF,甚至3.5NF(Boyce-Codd)的含义举例,写一个更容易理解的解释.
在关系数据库设计中,有一个数据库规范化或简单规范化的概念,即组织列(属性)和表(关系)以减少数据冗余并提高数据完整性的过程.(如第Wikipedia页所述).
由于大多数文章都有一定的技术性,因此更难理解,我要求有人根据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 |
这是not in 2NF,因为第四列不依赖于entire键-而只是它的一部分.课程名称取决于课程ID,但与选修哪个学期无关.因此,如您所见,我们有重复的信息-有几行告诉我们ITentire正在编程,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-所以这是not in 3NF.要解决此问题,我们的操作与2NF中的操作大致相同-从该表中取出TeacherName字段,并将其放入自己的字段中,该字段以TeacherID为键.
Primary Key |
TeacherID | TeacherName |
---------------------------|
332 | Mr Jones |
495 | Mr Bentley |
242 | Mrs Smith |
没有冗员!!
需要记住的一点是,如果某个东西不在1NF中,那么它也不在2NF或3NF中.因此,每一个额外的标准形都需要everything个较低的标准形,再加上一些额外的条件,这些条件必须满足all.