数据库的设计可是一门大学问,如果没有亲手开发过好几个项目,基本上是不能真正掌握的,简单点的设计字段类型的选择、表结构的设计,复杂的还得考虑项目的体积,相应地进行分表、分库等等操作,这些就超出我的能力范畴了,我也还不具备资格在这里说些大话,不过学习到了一些理论知识,还是想在这里记录下来,以后看起来方便点。
说起数据库设计规范,想必大家都听说过所谓的“第三范式”或者“三大范式”。其实许多规范中,除了出名的第三范式之外,还有第一范式、第二范式等等六种主要的范式,之所以第三范式这么出名,是因为第三范式是基于第一和第二范式的,即满足了第三范式的同时也满足第一二范式,所以才有我们经常说的“满足第三范式”或者满足“三大范式”。
为了避免不规范的数据库出现数据冗余,造成插入、删除、更新操作异常等情况,就要满足一定的规范化要求,即所谓的数据库设计范式。接下来就简单介绍一下最出名的三大范式。
第一范式:数据库表的每一列都是不可分割的基本数据项,同一列中不能有多个值,即实体中的某个属性不能有多个值,或不能有重复的属性。即遵循原子性,属性不可再分。
举个例子:如果学生表里有一个住址字段,存的内容是30栋4层401,那么就违反了第一范式,有重复字段,应该将住址字段分成楼号+楼层号+房号,或者楼号+房号(根据实际需求)。
第二范式:在第一范式的基础上建立。实体的属性完全依赖于主键,不能仅依赖主键的一部分(复合主键)。即遵循唯一性,非主键字段需完全依赖主键。说得浅显一点就是,同一个字段不要存在多个表中。
也举个例子:有一个表中有学生id、课程id、分数、学号、课程名等字段,那么其实通过学生id和课程id就能确定学号、课程名等信息,不需要再在这个表中存储了。
第三范式:要求一个数据表中每一列数据都和主键直接相关,而不能间接相关。即非主键字段不能相互依赖。
也举个例子:有一张课程分数记录表里有四个字段:记录id、学号、课程名、分数。此时就违反了第三范式,学号和课程名都是主键间接相关,应该换成学生id和课程id。
范式虽然减少了数据冗余,使表变小,减少了表更新出错的可能性,但是增加了表的数量,使查询表操作变复杂,性能降低。所以是否应该适当地违反范式,用空间换时间,就是我们应该选择的了。
执行频繁更新的应用程序通常具有许多张表而具有很少列,而分析大量数据的应用程序通常具有较少的表而具有很多列。
简单的数据库设计规范介绍到这里就算结束了,其实我只是简单地提了一下三大范式而已,并没有说多少,要是真的要学数据库设计规范,还要掌握数据类型、约束、索引,甚至还得精通SQL语句,考虑要不要使用视图、触发器、存储过程等等,可以说是得完全精通MySQL才行了。
另外,如果你有兴趣,或者是有问题想要与我探讨,欢迎来访问我的博客:https:mu-mu.cn/blog