什么是数据库规范化形式,能给出例子吗?
什么是数据库规范化形式,能给出例子吗?
目前,这个问题不适合我们的问答格式。我们期望答案支持事实、参考资料或专业知识,但这个问题很可能会引发争论、辩论、投票或长时间的讨论。如果你认为这个问题可以改进并可能重新打开,请访问帮助中心获取指导。
在关系型数据库设计中,有一个概念叫数据库规范化或简称规范化,它是一种组织列(属性)和表(关系)以减少数据冗余和提高数据完整性的过程。 维基百科
可以举例说明1NF、2NF、3NF和3.5NF(Boyce-Codd BCNF)是什么意思吗?
admin 更改状态以发布 2023年5月21日
1NF是最基本的规范形式——表格中每个单元格只能包含一个数据,且不能有重复的行。
2NF和3NF与主键有关。回顾一下,主键可以由多列组成。正如克里斯在他的回复中所说:
数据依赖于键[1NF]、整个键[2NF]和只有键[3NF](救救我吧,科德)。
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是完整的键。
Primary Key | CourseID | Course Name | ---------------------------| IT101 | Programming | IT102 | Databases | IT103 | Web Design |
没有冗余!
3NF
好的,现在假设我们还要将课程老师的姓名及其相关信息添加到关系型数据库中:
|-----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也不符合。因此,每个进一步的规范形式需要低于它的规范形式具有的所有内容,以及必须满足的额外条件。