关于业务逻辑与数据库分离的问题。 (100分)

Unregistered / Unconfirmed
GUEST, unregistred user!
在面向对象的设计时,不可避免的要涉及到对象的持久化问题。由于目前关系型数据库的流行及SQL语言的强大功能,一般都以关系型数据库存储要持久化的对象。
但一般认为数据库是实现细节,应该和业务逻辑对象分离,以保持业务对象的可复用性及可扩展性。为了业务逻辑与数据库分离,比较常见的推荐的做法是使用Proxy模式。
举个例子如下:
有一个订单类Order,它包含一些订单项Item。象这样的对象的持久化问题大家都非常熟悉了。就是有个ORDER的表来存储ORDER对象,这个表有个ORDERID关键字用来唯一标识每个Order对象。还有一个表ITEM用来存储订单项,每个ITEM通过ORDERID同ORDER表关联。
假设使用PROXY模式分离Order的业务逻辑与数据库的做法是:Order分成3部分。第一部分是一个接口order,其中包括客户要调用的所有方法。第二部分是一个类orderimp,它从接口继承,它在不涉及数据库的情况下实现接口中的所有方法,第三部分是一个知晓数据库的代理类orderproxy。它也从接口继承.
比如现在我要计算某订单的总金额。ORDER接口有个TOTAL方法来实现这个业务问题。PROXY的工作原理是,客户使用调用ORDER接口的TOTAL方法。orderproxy从ORDER表中取出ORDER对象,然后从ITEM表中取出该订单的所有订单项并加到ORDER对象中。然后调用ORDER对象的TOTAL方法。
这样做的好处是。数据库完全不参与业务逻辑,实现了业务逻辑与数据库分离。但我认为这样做的代价是比较大的,特别是订单项比较多并且业务逻辑非常复杂的情况下。从数据库中取出数据组合成对象,然后通过对象完成功能不但增加了实现的复杂性并且效率也是个问题。如果直接用SQL语句完成,虽然偶合了业务逻辑,但简单直接,而且效率比较高, 其实上边的问题直接用SQL语句“select sum(item.price*item.quantity) from item where orderid= n " 不是更好么?
大家对这个问题怎么看?
 
文章太长了,有空再看。
 
值得探讨
 
对!是这样我也喜欢后一种,但我也常在想是否图一时的方便.希望各位大峡介绍.
 
OO、设计模式其实系针对不仅复杂、大型的软件, 象我们平时做的小型MIS系统,用不上,用了反而效率低, 但刚开始学习可以用来实践用
Delphi在OO编程、UML等方面,自身支持不够,也缺乏第三方软件的支持 。。。
 
学习ing..................
 
我的建议的要分层来做,我现在也是这么做的.
因为我们现在所用的数据库一般都是二维关系表,这种的采用数据表的方式来管理数据对于我们的应用程序的业务逻辑开发并没有什么好处,如果直接客户端用SQL来实现业务逻辑的话就会把程序搞得非常复杂,而且不易看懂,这对以后的维护与重建是非常不利的.
我的方法是采用分层的办法,在二维数据表到我们要实现的业务逻辑中间做一个过渡,结果是把客户的函数的调用逐步的转换成SQL语句,简接的对数据表进行操作.
这样做会牺牲掉一些性能,但程序脉络清晰,非常容易增删程序的功能.而且各个层次可以同时开发,相对于牺牲一点性能是非常值得的.
对于要求较高的个别操作,我们可具体对它减少层次来提高其性能.
 
概念都错了,数据库的存在完全就是为了体现业务逻辑
 
哦.
为了体现业务逻辑?
不大明白这个"为了"在这里是什么意思?
可以解释一下吗? 谢谢!!!
 
其实不能把这当做两个问题来讨论,这是一个问题的两方面,就像先有鸡还是先有蛋一样!我们应该在性能和速度之间取得一个最好的中间点,并且对于每个工程而言,他的取值都是不一样的,我个人认为!
 
数据库编程一般不会涉及到高数据流量的问题.
通常情况下有高数据流量要求的操作都是通用特定的操作来处理.
 
对于比较简单的应用,好的数据库设计,加上分层,业务层对外提供服务接口也是可以的.
但对于比较复杂的应用,光靠数据库设计体现的E-R关系,可能是远远不够的.而且MIS系统
随着若干年的维护,需要变更,数据库本身会显得越来越冗余,这也表现了数据库设计面对
需求变更而进行修改是困难的,或者说代价很高. 而对外服务应用,会表现出很强的过程式
的设计倾向,使得业务逻辑很难重用. 这时分层服务接口+数据库就显得比较难以控制,
这时有必要引入领域模型.由领域模型来表现业务逻辑,而业务接口是作为领域模型的
facade层. 关于领域模型的问题 可以看看<分析模型>,但我没看懂. 也有人推荐<coloruml>http://forum.javaeye.com/viewtopic.php?t=1407 ,刚在看.

 
我有一个好的建议,通过中间件的技术来实现,比如bea的tuxedo,weblogic等
 
tuti
你给的是什么网址啊?
 
关于业务逻辑与数据库分离的问题, 是个逻辑分层的问题.
于是否使用中间件关系不大.
 
怎样设计一个数据库可以满足大多说实际情况,就是说数据库能自适应实际情况的变更
 
数据层和业务层相分离,是现在业界上比较推崇的一个思想。
(具体的还是微软搞的:提出了实体、数据层、业务逻辑、业务外观、界面层的概念)
实体:就是对应我们的数据表;
数据层:是和数据库打交道的,包括最基本的增、删、改的操作。(最好用存储过程来完成);
业务逻辑:是一些程序输入的项的非法验证、消息提示。。。。
业务外观:是实现对数据表的增、删、改、查。。。的操作。以便界面层的调用;
界面层:程序和用户进行交互的地方,也就是通常的表现层;(不和数据层打交道,直接调用业务外观层封装的方法和数据层交互)
个人认为:这种模式适合于大系统的开发(企业级的解决方案),需要不断的维护升级。
不适合一两个人就能完成的一个小系统。
优点:程序层次清晰、方便维护和程序的扩展。即便是前期开发程序的人员走了,后期
介入的人员也能很快的熟悉程序的脉络,尽快的进入角色之中。
缺点:程序的前期工作量比较大。
要求:公司要有好的系统设计人员,好的系统架构师。
 
这其实是架构设计的取向问题:
如果是分布式系统,而且数据层变动或者迁移频繁,显然数据和业务逻辑相分离比较好;
如果不是分布式系统,仅仅是简单的多层结构,那为性能和开发成本记,数据和业务逻辑应采取松耦合的方案;
但是,数据层逻辑允许界面层调用(特别是大量使用数据感知控件的界面),但数据层逻辑集中封装,应该是值得提倡的一个编程习惯。
 
能把界面层清清爽爽地分离出来就很不错了
 
顶部