在目前的项目中,因为涉及到一些较复杂的统计功能,我在某个表中添加了三个字段:
nums1,nums2,nums3
这三个字段分别为table1,table2,table3中相关的有效记录行数。
添加这三个字段的原因如下:
原因1: 在页面显示中,如果没有这三个字段,单纯靠sql来生成显示列表的话,需要关联三个表,这三个表都是记录较多的表,关联起来效率很低。
原因2: 在网站的前台,有了这三个字段,可以减少对table1和table2,table3的select,提高效率。
居于上面的原因,增加上面三个字段有利于提高程序运行的效率。
但在真实的开发过程中,发现这样的设计存在很大缺点。
具体的缺点如下:
A 开发困难。table1,table2,table3中的数据增减,都要相应的对nums1,nums2,nums3进行加1或减1的操作。所以这些操作都需要用事务实现。
B 健壮性不足:通过数据库的事务,可以保证nums1,nums2,nums3的正确性,但由于业务复杂,开发人员极有可能没有很好的保证事务的实现,而且开发人员对某些业务的理解错误,也可能会导致这些数据出错。
在这种情况下,只要在某个时间点,数据发生了错误(少加了1,或者少减了1),错误就会一直存在下去,直到某种临界情况,才会发现问题(当然运气好的话,问题可能会一直隐藏下去)。一旦发现问题之后,修正过程可能是痛苦而危险的工作。
因此,此处的DB设计中,这三个字段的添加是不必要的。现在回头看,此设计不符合以下设计原则:
1 软件设计的核心问题是:管理复杂度。上面三个字段的添加,只考虑了页面显示的效率和减少数据库查询,但增加了程序的复杂度,得不偿失。
2 减少数据冗余,减少数据依赖:逆范式化的DB设计,虽然可以提高程序运行效率。但要考虑:保持数据的一致性是否会很复杂;如果数据不一致的后果是否严重。
那么如何在不增加上面三个字段的情况下,同时解决“原因1”和“原因2”的问题呢。可以采用如下方法:
1 要避免大表关联,可以分别查询各个表的结果,然后在php里面进行“连接处理”。或者考虑引入临时表都是可以考虑的方案。
2 在某些页面,如果确实需要减少对 table的select,需要用到nums1,nums2,nums3,可以将这个字段生成cache。视实际情况,cache可以放在file中,或放在APC/accelerate等中,或memcached等分布式cache中。这边的缓存策略视实际需求,可能也会比较复杂,但效率会比直接操作DB高。
当然,如果你只是统计下浏览人数等类似数据,或者业务逻辑很简单的话,那还是直接添加个统计字段,并在必要的操作上时加上事务就可以了。
分享到:
相关推荐
html中的脚本调用中的脚本。 元素的onClick事件调用的脚本。
VC++视频开发实例集锦(包括“远程视频监控”"语音识别系统"等13个经典例子)VC++视频开发实例集锦(包括“远程视频监控”"语音识别系统"等13个经典例子)VC++视频开发实例集锦(包括“远程视频监控...
"格力造"ERP
"JAVA程序设计"
Poulenc "Napoli" Suite
全球出击的"天狮现象".doc
"密聊"采用 2048bit 的 RSA 数据加密算法对数据进行加密和数字签名,由于 RSA 加密少量的信息需要大量的时间,适合用来传递密钥或对重要而敏感且较少的信息通讯.实现的消息通讯安全功能包括1. 身份验证,使收...
父母自律才有一家人"好好学习"
"公路工程建设地理信息管理系统"
浅析对奈达"功能对等论"的认识
总结来说,C语言中的`#`和`##`符号是宏定义中的重要工具,它们分别用于字符串化和拼接操作,使得宏定义能处理更复杂的文本替换,包括生成唯一的变量名和结构体填充等高级应用场景。理解和熟练运用这两个符号,能够...
学校"安全进校园"活动工作总结.docx
"改革创新 奋发有为"主题演讲稿.docx
关于教育经费"三个增长"的算法说明.doc
用古文表达"我想你",文气十足!.doc
"专业版进销存源码"的压缩包密码集
如何在本职岗位上践行"三严三实"要求.doc
汉字字频统计结果分布 txt" ; writer1 write "汉字总数 "+totalNum+" r n" ; 汉字总个数 writer1 write "汉字种数 "+totalKind+" r n" ; 汉字种类数 writer1 ...
山头乡继续深入开展"安全生产年"活动实施方案.docx
"数字郑州地理空间框架建设及应用示范项目"空间数据库...