关于数据库反范式设计
2016-05-02 13:04
232 查看
之前并没有对这个问题有一个确切的概念,之所以要反范式,一定要知道为什么要反范式设计,设立就先从三范式说起。
从我的记忆中,三范式这么要求:
第一范式:一张表不能够有相同的字段,这是所有范式的基础。
第二范式:一张表必须要有唯一标示
第三范式:不依赖其他非主属性
上面的范式从数据库的设计角度并没有什么问题,但是,在实际的项目设计中会出现很大的问题。
举例: 使用ORM框架,如hibernate,mybatis等,如果完全的遵守范式设计,那么在效率上会存在很大的问题,
原因如下:
如hibernate查询会查询所有的记录信息,这是如果有外检一对多,多对多等关系势必影响系统效率。
另一方面,如果完全遵守范式要求,虽然在一定程度上降低了数据库的yongyu度。但是系统的可维护性会大大的下降。
如果仅仅是这量反面就有足够的理由去做反范式要求了,与其遵守范式要求,不如将更多的业务封装在代码层,这样做的好处就不言而喻了。
综上,总结处一个反范式设计的目的:用空间去换时间。
空间在这里的成本其实是远远低于时间成本的,随着项目的发布,空间成本会越来越低。
所以,反范式设计其实是一个不错的选择,特别是数据量特别和业务复杂度不高的情况下。
从我的记忆中,三范式这么要求:
第一范式:一张表不能够有相同的字段,这是所有范式的基础。
第二范式:一张表必须要有唯一标示
第三范式:不依赖其他非主属性
上面的范式从数据库的设计角度并没有什么问题,但是,在实际的项目设计中会出现很大的问题。
举例: 使用ORM框架,如hibernate,mybatis等,如果完全的遵守范式设计,那么在效率上会存在很大的问题,
原因如下:
如hibernate查询会查询所有的记录信息,这是如果有外检一对多,多对多等关系势必影响系统效率。
另一方面,如果完全遵守范式要求,虽然在一定程度上降低了数据库的yongyu度。但是系统的可维护性会大大的下降。
如果仅仅是这量反面就有足够的理由去做反范式要求了,与其遵守范式要求,不如将更多的业务封装在代码层,这样做的好处就不言而喻了。
综上,总结处一个反范式设计的目的:用空间去换时间。
空间在这里的成本其实是远远低于时间成本的,随着项目的发布,空间成本会越来越低。
所以,反范式设计其实是一个不错的选择,特别是数据量特别和业务复杂度不高的情况下。
相关文章推荐
- Redis运行流程源码解析
- Redis命令-集合-sinter
- Redis初认识——竹子整理
- redis codis 安装部署
- Redis如何处理客户端连接
- 安装mysql-5.7.12-winx64
- Redis命令-集合-sdiffstore
- 最新mysql5.7.12 win64 安装及配置
- 第56课:解密Spark SQL与DataFrame的本质
- mysql大页内存的使用
- 【机房重构】【报表】异常处理
- 使用PreparedStatement防止SQL注入
- 利用脚本获取mysql的tps,qps等状态信息
- Oracle 11g R2 RAC高可用性连接
- MySQL索引原理
- Redis日常使用随笔
- redis的aof方式持久化
- mysql磁盘设置
- mysql:数据表的基本操作
- Redis命令-集合-sdiff