软件的两种存取方式的区别和优劣
在两年多的软件开发中,我多次遇到一个问题,也就是软件内部的数据存取管理。
一种方式是数据实时到数据库中存取,另一种是先读取到内存中,然后通过用户的特定操作保存到数据库
或者硬盘中。
我参加开发的软件都是Mis系统,以前设计的软件都是直接对数据库操作,也就是对一个对象进行新增、修
改、删除操作都是直接对数据库操作:
图一
一年前我开发的软件这三个操作还是用SQL语句直接完成的,这样很不容易管理。现在我开发的软件都是用
面向对象的方式设计的。新增、修改、删除(AED)操作都已经封装成了类的一个方法。但是在操作低层,仍然是
用SQL语句完成的操作。也就是说,仍然是频繁读取数据库。
这样做有几个好处:
1。内存中的数据是和数据库中的同步的,这样掉电对系统的影响就很小
2。内存中的数据是和数据库中的同步的,这一点对C/S系统很重要,保证了多个工作站协同操作的正确性。
缺点:
1。读取数据库频繁,硬盘负荷大
2。大数据查找遍历都是依靠数据库的SQL来完成,虽然效率高,但是Sql复杂时(这种情况很多,通常的报
表都涉及数个表,复杂一点的sql都有几十行sql语句),开发和维护这样的sql语句都是一件非常痛苦的事情。
而且没有办法面向对象话,如果要面向对象化,那么就会出现用n条sql语句来换取对象化的情况,象下面的报
表:
图二
有开发经验的软件工程师都知道,只要数据库设计合理,上面的结果用一条简单的sql语句就可以得到。但
如果第2列不是交易数量,而是交易成本,而且交易成本的计算是一个很复杂的表达式,那么你也许更情愿将其
对象化,将成本计算写进代码,而不是放进sql中去搅。这样当你计算公式改变时,你就不用更新n处的sql了。
考虑到以上情况,我考虑将系统中的所有数据都放到内存中进行处理。大家看Word,Excel这些国外知名公
司的产品也是如此。
当打开Word时,进行任何操作,只要你不保存,中间结果都没有更新到硬盘上。包括Word程序本身的一些
设置。如果非法关闭,也无法保存。这么说来微软在处理时也将文档对象化,放到了内存中去处理,这样做很
有好处:
程序语言的处理非常丰富,可以充分运用算法和结构,获得更好的速度和运算效率。(这里要说到一个事
实,就是我从事了两年的在一个MIS系统开发,从来没有在一个产品中遇到用代码处理排序、查找算法的情况,
不是因为没有使用排序和查找,而是用SQL代替了)再就是数据都在都在内存中,操作方便,速度也很快。更为
重要的是,限制使用Sql,完全对象化后的程序可以很方便的调试、跟踪和错误处理。精简了环节后,程序的运
行稳定性也要高得多。
修改后的模型是这样的:
图3
有一个代价,就是全部放入内存的程序内存开销肯定高。我们经常埋怨微软的东西占用很多内存,可能就是
这个原因。我相信这个代价是值得的,因为这样的软件运行效率更高,更加稳定(这儿的稳定不仅是内存操作
比硬盘稳定,更重要的是模块化的东西经过了更严格的单元测试和系统测试)。
所以我提出一个问题,程序开发是否原则上应该把数据对象化并放入内存,程序大部分应该是业务的处理而
不是存取数据库。
这个问题看起来小,但是对程序的运行效果和表现形式都有很大区别,我所读过的书也没有提到这个问题,
希望大家能够一起探讨,真正把自己软件的性能提上去。
彭刚 pen_gun@yeah.net