我的困惑,请大家帮忙(2)--关于数据访问层,业务层,界面层的问题

以前做信息管理系统都是所有程序写在界面层,数据访问都用象CRecordSet这类的对象来实现。现在想数据访问层,业务层,界面层分离。

我碰到的问题:
1、是否对数据库中需要维护的每张表定义一个类?或定义两个类一个STATEFUL(数据)类和STATELESS(接口)类?
2、对于修改、插入记录数据正确性的校验必须放在数据访问层,业务层,界面层中的那一层?
3、对于只是数据的维护,不涉及业务,如代码表的维护,是否界面层直接调用数据访问层的对象?

我对上面两个问题的想法:
问题1、每张表定义一个类那要定义好多类?如果我还用以前的方式,把CRecordSet当做数据层的对象,那我觉得没有实现分离,因为调用CRecordSet对象需要写SQL语句,也就是需要知道数据层的细节?
问题2、把数据检验放在界面层,把界面层做的太复杂了,而且我觉得也不是应该由界面层控制的,把数据检验放在数据访问层,那么需要定义许多数据检验失败的返回值,如插入记录时,有10个字段,必须定义10个错误返回值,表示哪个字段检验失败,程序写起来很麻烦。
[514 byte] By [LXJ2001-lxj] at [2008-6-5]
# 1
Q:1、是否对数据库中需要维护的每张表定义一个类?或定义两个类一个STATEFUL(数据)类和STATELESS(接口)类?
A:不一定,这是一个对象-关系映射问题,首先你要先设计出对象模型,然后在映射为数据库设计,O-R mapping 的策略有很多。

Q:2、对于修改、插入记录数据正确性的校验必须放在数据访问层,业务层,界面层中的那一层?
A:每层都要有对数据正确性的校验。但是越早进行校验对用户来说越友好。

Q:3、对于只是数据的维护,不涉及业务,如代码表的维护,是否界面层直接调用数据访问层的对象?
A:当然可以,但是这样不好。

mach-照虎画猫 at 2007-10-24 > top of Msdn China Tech,PowerBuilder,控件与界面...
# 2
老兄们,upload 一点原代码吧
学学
lxh_csdn at 2007-10-24 > top of Msdn China Tech,PowerBuilder,控件与界面...
# 3
1.每张表需要一个entity bean,不是session bean,多少个session bean根据业务逻辑判定
2.简单校验在界面层(如数字,字符校验),复杂校验在业务层(session bean中)
3.最好通过业务层访问entity bean

一点浅见。
guohong98-心平气和 at 2007-10-24 > top of Msdn China Tech,PowerBuilder,控件与界面...
# 4
呵呵,最好不要用实体bean,我们原来也都用实体bean的,尤其是bmp,没任何好处
用实体bean的缺点:开发难度大(bmp)、复杂关系不好实现(cmp)、系统开销大
IBM和BEA的人都不推荐使用实体BEAN
mach-照虎画猫 at 2007-10-24 > top of Msdn China Tech,PowerBuilder,控件与界面...
# 5
按这种方法,要定义好多类,程序写起来不如我以前那种大杂烩来的快?
我的entity bean就是CRecordSet,也不用特别定制其它的类来访问数据库中的表,CRecordSet就足够了。
LXJ2001-lxj at 2007-10-24 > top of Msdn China Tech,PowerBuilder,控件与界面...
# 6
to mach(照虎画猫):
如果数据库中每张表不定义一个类的话,那怎么访问它?是不是定义一个类就可以访问很多表?
按照三层分离,所有的SQL语句都应该在数据访问层的类里面,而不应该说调用数据层的对象的成员函数时,给它传递一个SQL语句。那么就无法定义一个象CRecordSet一样可以访问任何表的通用的类。
LXJ2001-lxj at 2007-10-24 > top of Msdn China Tech,PowerBuilder,控件与界面...
# 7
to LXJ2001(lxj)
从你的描述来看,你的概念不对,不是要为每张表定义一个类,而是要对类进行关系-对象映射来确定需要几张表!
首先要明白类和数据库表是两个概念,在很多情况下一个有持久化要求的类可以映射到一个数据库表上,但这不是一定的,从OO的方法而言,首先有了类,然后决定那些类需要被持久化,然後看怎么持久化,这就是O-R mapping,实现关系-对象映射有很多原则和方法,举个例子,你有一个基类“职员”,有这个类的两个派生类“校长”、“教导主任”,这样的继承关系怎么用数据库表来实现?有3种方法,各有优缺点:
1。每个类用一个表来实现,这样做可以充分体现OO中的优势,但是查找和更新都不容意,因为没查找或更新一个子类对象,都要涉及它的基类,这样要对两个表操作。
2。这三个类用一张表来实现,这样做得好初是查找方便,但不能体现OO的优势,比如要修改基类,则要修改所有子类对象中相应的字段,由于两个子类在一张表中,肯定造成冗余。
3。每个子类一张表,基类的属性分布在每个子类中,这样做有和2同样的问题(修改基类的问题),但是消灭了冗余,但是这种方法比2在统计数据方面有劣势。
具体采取哪种方法,要看实际使用的要求,比如要是很少修改基类,那么采取后两种方法比较好。
mach-照虎画猫 at 2007-10-24 > top of Msdn China Tech,PowerBuilder,控件与界面...
# 8
to mach(照虎画猫)
我的概念确实有问题,我不应该从数据库的表的角度开始,去推出类,而是从类推出需要那些表,这个我有点明白了。
现在的问题是:
根据上面的O-R mapping例子,我是否可以得出一个结论,一个数据库中的表一定最少对应一个访问它的类?因为表都是由对象映射出来的。
LXJ2001-lxj at 2007-10-24 > top of Msdn China Tech,PowerBuilder,控件与界面...
# 9
是的,类和表之间是多对多的关系,可能一个类映射到多个表,也可能一个表可以被多个类访问,但是如果使用OO的方法的话,一个数据库中的表一定最少对应一个访问它的类!
mach-照虎画猫 at 2007-10-24 > top of Msdn China Tech,PowerBuilder,控件与界面...
# 10
谢谢,结帐拉
LXJ2001-lxj at 2007-10-24 > top of Msdn China Tech,PowerBuilder,控件与界面...