查阅数据库三大范式相关理论知识的过程中,我想起了某一次面试,面试官问我要设计一个学生管理系统,数据库这方面你想怎么设计。我当时噼里啪啦讲了好多具体怎么做,有什么表呀,什么字段呀,根据业务来具体决定之类的。面试官当时笑眯眯的,也不给个提示。现在想起来,大写的尴尬。其实业务上,你没做过相关行业,很难说的比较准确的。面试主要还是一些经验理论的解决方案,规范之类的,比如数据库表怎么设计,参数怎么调,字段怎么定义。实际工作中,我们设计数据库表也是会尽量多思考实际业务情况,尽量把表设计得好一点,可是工作归工作,面试归面试。做出来的东西都是需要理论等其他知识支撑的。
第一范式
每一列都是不可分割的原子项数据。这个很好理解,就是分得不能再分了。
比如详细地址,省市区街道,如果实际业务上是要具体到某一个省,某一个市,那么详细地址就要拆分出来具体到省、市,单独存省、市字段。
第二范式
实体唯一性,不存在部分依赖。
比如表: 学号,课程号,姓名, 学分
很明显,姓名是依赖于学号的,但是学分是依赖于课程号的,这种就需要单独的拆分出来。
变成表1:学号,姓名;表2:课程号,学分
第三范式
不能有传递依赖。
比如表:设备编号,设备名称,所属机构,所属机构名称
存在依赖(设备编号)-》(设备)-》(所属机构)-》(所属机构名称)
这样数据冗余,更新异常(同时修改多条记录)
所以这种情况也应该要拆分出来。
变成表1:设备编号,设备名称;表2:所属机构,所属机构名称
反范式
但实际工作中,往往不能尽善尽美。比如因为某个字段造成查询慢的问题,我们不得不把这个字段的信息冗余到一个表中,这就违反了三范式。