蛙蛙池塘
人生价值的最好体现就是做好本职工作...
posts - 186,  comments - 1618,  trackbacks - 60

蛙蛙推荐:置疑纯ORM方案 
纯orm方案的缺点:
处理复杂对象查询时有难度。数据模型中的所有表格及关系很复杂,包括关联、引用(也就是主从表)和继承三种关系,甚至包括嵌套的复杂关系,在做or mapping的时候非常复杂。
对应于表中的连接查询,如果直接写sql语句违背了map 规则,不写,灵活度不够。虽然在一些ORM方案中也可以把数据库表之间的关系也映射到对象层里,但是这样在数据库和数据访问层之间增加了一个映射层,再说了映射用的元数据都是XML格式的,访问这个XML文件的时候还得做额外操作,性能肯定要降低了(当然可以在应用程序启动的时候把元数据都缓存起来)。而且那个什么Opath语言,我看不出来和t-sql相比,他有什么优势,Xpath是查询XML用的,它用来查询Object,但是它的Opath查询,最后还是得转换成SQL来查询数据库呀,而且很可能一条Opath语句查下去可能得生成好几条SQL语句,而且它生成的SQL语句有你自己写的语句可靠吗,有你自己写的sql语句性能好吗?我看呀,以后这人们就都不用学sql了,直接学这个Opath就行了,到时候只有高手才会写SQL语句,就象初学者只会调用.NET封装好的类一样,而不知道这些类是怎么封装了COM和API的。我不是说这不好哦,这样做入门是简单了,可是人们被迷惑了似的,多年以后肯定只有微软自己的人才知道这些类的实现原理,而人们想接触一下底层的东西就很难了,我担心有一天我们的精力不够了,从懂事就开始学编程,一直学到40岁了才算入门,还啥都用不上,因为知识太多了,要想实现一个简单程序就得学10几年的知识,这不是悲哀吗,呵呵,撤远了哦。

下面说说我的想法哦:
我感觉将关系数据映射到业务实体,还是手工或者半手工做的比较好,因为你完全靠工具来生成OSD,RSD,MSD这些文件肯定不能完全覆盖你在领域分析后得出的问题域,工具哪儿有人智能呀,人有时候还分析不出来呢?

而数据库层面的的业务逻辑实现(细粒度的)还是用存储过程来做比较好,而靠Opath这类的语言生成的sql语句肯定不能达到最优化(你能相信DataAdapter自己生成的数据更新sql语句吗?还是使用自定义命令呀?),而且在集合处理方面还存在问题(你说在内存里建立1000个对象的实例和建立一个有1000行的DataTable哪个开销大?),orm是建立在ADO.NET之上的,以后人们是不是连ADO.NET也不用学了呀,直接把对象组成的ArrayList绑定到DataGrid上呀?

现在这人是越来越懒了,我感觉写一个程序最重要的工作还是业务建模和写业务层的代码,这个层的代码估计除了MDA没什么工具可以生成的吧(个人感觉MDA也不是很合适的软件开发方法)?当然了,向orm这些东西属于次要复杂性,本应该是由工具和语言来完成,而不应该耗费程序员的精力(谁也不会否定面向对象的软件开发比结构化编程有优势,谁也不会否定递归算法很巧妙,尽管它耗费资源),但是我感觉还没成熟到那种全自动的程度吧,在全自动生成和全手工编写之间我们得找一个平衡点儿。

我们的目标是在数据库从sqlserver换成oracle,一个表里增加了两个字段的时候,客户要求再给某个对象增加一个方法的时候我们只要改动数据访问层和业务实体层就可以了,而尽量不改动业务层和表示层的代码,也就是维护方便。我们想利用ORM来达到这种效果,我们认为数据实体层和数据访问层只改动元数据就可以完成维护工作了,可是这些东西用了大量的反射(性能降低了),而业务层代码和UI不用改了吗,这怎么可能呢?你数据表里增加个字段,你的业务层的方法签名不需要改吗(就算你用业务实体(业务实体根据xml确定)做传入参数,但是方法里面处理的时候你不得变呀)?还有你的界面显示的时候不还得变呀,你不做客户端的数据验证代码了吗?这问题多着呢,哪儿能那样一劳永逸呀?现在还除了好多代码生成的工具,甚至界面也能靠XML生成了,人都考虑不过来的东西,让工具去考虑,真是的。

我想我们一定是厌倦了在c#里写那么多重复繁琐的sql处理代码了,我们是想把处理sql或者存储过程的这些代码自动化,我们不想为每个存储过程的调用手工创建一大堆参数,然后给参数赋值,然后再调用DAAB执行,还得考虑参数缓存什么的,我们肯定讨厌这些重复工作了,我们想存储过程修改(无论是存储过程本身改变还是从sql的存储过程改变成oracle的存储过程)后我们的数据访问层能自动适应,自动创建参数,自动赋值。如果想这样,就得给存储过程建立元数据,而不是给表建立元数据,表对应的是Object(实际物体,订单啦,产品啦),而存储过程对应的是Action(例如增加或者取消一个订单)或者Service(例如根据某个条件来生成一个DataView)的数据层实现,当然有人说了“随着在存储过程中实现的业务逻辑的增多,存储过程可以简化维护带来的优势会逐渐减弱”,可是那也比纯用Opath这类更高层次的语言来实现数据访问有优势吧,再说了存储过程只封装细粒度的业务逻辑,返回简单处理后的数据,然后由数据层经过复杂处理才提供给业务层的。我估计光Opath也不能完成粗粒度的业务逻辑吧,也得把结构提供给业务层吧?

我设想了一个架构(抄的,不过感觉很灵活):
MonitorServices:负责监控和跟踪。
MonitorServicesLogging:负责日志记录和错误处理。
ConfigurationServices:负责配置服务,从.config里读取配置数据。
CMPServices:提供CMP处理
这几个项目提供底层服务,微软发布了7中企业开发模块,里面几乎都包含了上面我提到的这些东西(除了最后一个),我感觉我提出的这几个是必要的,比较通用,加密解密和缓存是可选的,有的项目里用不到吧,看项目需要再做添加。

别的好说,微软的企业开发模块里都包括了,在设计模式和实际操作上都给了一些指导,微软好像有视频下载,下载下来看看,理解一下,再参考MSDN的类库开发人员指南,写出自己的类库就行了。
着中看一下CMPServices类库,在这里执行操作存储过程,首先肯定得有个类负责读取存储过程的元数据,元数据里包括了存储过程的名字,参数的信息,以及对应的业务实体类(业务实体类可以用代码生成器生成再改改),这些元数据放在.config里,如果这些东西改了,调用存储过程的代码自动就改了。而不象petshop里那样为oracle和sqlserver写两个dal层,然后用通过接口和工厂类来确定使用哪个类库,这还算好的,普通的方案的BLL层里调用DAL层的方法的时候用的是RunSqlserverSP(strSP)或者RunOracleSP(strSP)这样的方法,DAL层和BLL层是紧密耦合,这些都属于托管组件持久性(Component Managed Persistence),而我想用的是托管容器持久性(Container Managed Persistence)。当然这个类库里还要设计好几个类来提供业务实体的持久性,简单介绍一下。
CMPConfigurationHandler:读取.config里的XML数据生成容器映射和命令映射类,并缓存起来。
CommandMapping:命令映射类,存储过程的名称,参数等,对应一个命令。
CommandParameter :存储过程的参数,包括参数的类型,长度,方向等
ContainerMapping :容器映射类。
ContainerMappingSet :一组容器映射类。
PersistableObject :持久类,和业务实体类差不多。
PersistableObjectSet 一组业务实体类,如果一个select语句返回1000个记录,与其生成1000个PersistableObject的实例,不如保存在Dataset里。
StdPersistenceContainer:这是个容器基类,定义实现容器映射的成员,每个容器可以执行CRUD四个命令。
SqlPersistenceContainer :sqlserver的容器实现类,这里利用反射和XML元数据来建立存储过程元数据和持久类之间的关系。

写业务逻辑层的时候可以实力一个容器,然后调用容器的CRUD命令来执行操作,实际上这就是去执行存储过程了,而存储过程里你再去写更细的逻辑,给CRUD命令传递参数的时候可以把这个容器对应的持久类的实例传进去,然后容器自己就会处理持久类实例的属性和存储过程参数的对应关系。这样就相当于把存储过程包装起来了,也在持久对象和数据库间建立了一个层,但这个层比纯ORM的方案灵活吧,你也不用opath这类晦涩的语言执行关系数据库查询,存储过程你爱怎么写怎么写,只要能灵活应用这种架构,就能适应无穷无尽的业务逻辑。如果数据库变了,至少在数据访问层可以做很小修改就能完成维护工作,改元数据呗,至于由于数据库变化导致的业务层和其它中间层,显示层的改动可以通过其它技巧减少一些,肯定不可能一劳永逸的,我们差完全自动生成代码还远呢,你的基础架构越强大,灵活性就越差我感觉,因为动些越多,耦合性越强,到时候架构功能太多,我想去一项服务也不行,本身就难以维护了,是吧,就象.NET框架,部署的时候还得把它部署进去,20多M的东西,我写一愕几十K的程序得部署一个20多M的框架,我能不生气吗?

别人置疑.NET社区,偶就来置疑一下纯ORM吧,呱呱。

参考文章:
设计数据层组件并在层间传递数据
http://www.microsoft.com/china/msdn/archives/library/dnbda/html/BOAGag.asp
有做过的.NET平台上的O/R Mapping Persistence Layer的高人哇,谈谈感受好哇?
http://search.csdn.net/Expert/topic/2519/2519108.xml?temp=.491192
提高软件开发效率三板斧之二利用CMP模式
http://onlytiancai.cnblogs.com/archive/2005/07/06/187111.html


 

posted on 2005-07-23 12:09 蛙蛙池塘 阅读(5368) 评论(69)  编辑 收藏 所属分类: 每日随笔

FeedBack:
2005-07-23 12:17 | 木野狐      
不记得是在哪里了,好像看到有人提过:
“Anders Hejlsberg”说 ORM 是一个很大的倒退。

我很想找到这篇英文的原文来看看。
  回复  引用  查看    
#2楼 [楼主]
2005-07-23 12:46 | 蛙蛙池塘      
谁知道呢,反正高手们都研究那个,偶不会,只能置疑一下了,等偶成了高手偶也好好研究研究
  回复  引用  查看    
2005-07-23 12:50 | 木野狐      
关于存储过程的调用,我都不愿意使用 SqlHelper, 感觉还是太麻烦了。
实际项目中我是用的 Lostinet 写的 SqlScope 这个组件。
调用的例子大概像这样:

DataTable dt = SqlScope.ExecuteDataTable(@"
select
hospsoft_id, hosp_id, supp_id, soft_id, module_id, version, dt_begin, dt_end, is_active
from
tb_HospSoftware
where
hospsoft_id = @p0",
HospSoftId);

我觉得每次调用 sql 语句或者存储过程都自己写一堆语句实在是太划不来了。
  回复  引用  查看    
2005-07-23 12:55 | 木野狐      
老兄还是把“置疑”改成“质疑”吧,呵呵。
上次 idior 的 blog 里我也提了这个错别字了:)
  回复  引用  查看    
2005-07-23 13:05 | Teddy's Knowledge Base      

“我感觉将关系数据映射到业务实体,还是手工或者半手工做的比较好,因为你完全靠工具来生成OSD,RSD,MSD这些文件肯定不能完全覆盖你在领域分析后得出的问题域.”

ORM并不是对问题与的映射,而是对静态的领域实体类及其关联的映射。当然还不存在全自动的映射,任何ORM方案肯定要手动设置部分的配置文件,允许进行较细颗粒度的控制,当然一般会有默认属性。

“而数据库层面的的业务逻辑实现(细粒度的)还是用存储过程来做比较好,而靠Opath这类的语言生成的sql语句肯定不能达到最优化。”
 
sql语句生成和存储过程的优点不是不可兼得的,前者适合运行时动态构造,后者执行效率高,完全可以在一个orm中作为互为补充的两个方面。
 
“写业务逻辑层的时候可以实力一个容器,然后调用容器的CRUD命令来执行操作,实际上这就是去执行存储过程了,而存储过程里你再去写更细的逻辑,给CRUD命令传递参数的时候可以把这个容器对应的持久类的实例传进去,然后容器自己就会处理持久类实例的属性和存储过程参数的对应关系。这样就相当于把存储过程包装起来了,也在持久对象和数据库间建立了一个层,但这个层比纯ORM的方案灵活吧。”
 
实际上在ORM出现前的传统的方案就是这么做的,ORM之所以会发展起来,就是弥补了传统方案的很多不足,例如,重复功能的代码,不易修改维护,响应需求变动慢,还很大程度上较少了传统构架的持久层的测试的需要,等等,好处数不胜举。当然,ORM也并不是适合任何项目、任何情形下使用的,只有去了解ORM的本质,才能在需要的时候正确的选择是否使用ORM,或其他任何别的解决方案。我觉得,对待任何新事物都该抱这样的态度才是正道!

  回复  引用  查看    
#6楼 [楼主]
2005-07-23 13:12 | 蛙蛙池塘      
◎木野狐,我没看出你那个是怎么给存储过程参数赋值的呀
  回复  引用  查看    
#7楼 [楼主]
2005-07-23 13:19 | 蛙蛙池塘      
◎Teddy's Knowledge Base
恩,我看了几篇你的博客发的关于ORM的文章,也是,我对ORM有个初步了解才这么说的,还没有深入研究呢,是我有些地方想不明白才这么说的,没想到这些问题在ORM里都有很好的解决呀。不过我感觉我设计的那个方案,更容易理解,灵活性也很好,也可以节省好多代码,但还得写存储过程。不过我说的那样,数据库和数据访问层,还有数据访问层和业务层之间的耦合也降低了不少呀,我感觉也可用了,而且就靠10来个类就能完成,自己定制起来也很方便。哪些ORM的方案要想理解原理好难好难。
  回复  引用  查看    
2005-07-23 13:30 | 木野狐      
HospSoftId 这个变量传进去后组件自动完成赋值和构造语句执行等一系列工作了,我觉得比 SqlHelper 好用多了。
  回复  引用  查看    
#9楼 [楼主]
2005-07-23 13:32 | 蛙蛙池塘      
哦,这么回事呀,呵呵,hospsoftid是模式化并且能自动生成吗
  回复  引用  查看    
2005-07-23 13:44 | 木野狐      
这里可以自己做业务实体类的。 或者用工具生成都可以。
  回复  引用  查看    
2005-07-23 13:48 | idior      

@蛙蛙池塘
先深入理解object orient. 如果从数据库的角度来看o/r m.确实是退步.

some referrences:
http://msdn.microsoft.com/asp.net/default.aspx?pull=/library/en-us/dnaspp/html/CustEntCls.asp

http://www.paulwistrand.com/archives/11-DataSets-Vs-Domain-Models.html

sorry for english.


  回复  引用  查看    
#12楼 [楼主]
2005-07-23 13:53 | 蛙蛙池塘      
好的,谢谢idior提供相关链接,向高手看齐,嘿嘿,偶又一次知道偶错了。
  回复  引用  查看    
2005-07-23 14:05 | Teddy's Knowledge Base      
@idior:

你给的两片连接的文章本身诚然写得不错,不过,它主要讲dataset,应该不能完全代表orm吧?

我觉得不能说是“某种程度的倒退”,毕竟,任何解决方案总是有利有弊,新事物的出现,首先是为了解决以前不能解决的问题的,哲学书里说,新事物的出现不代表旧事物立即的消亡,它们是竞争关系,优胜劣汰,不断进化,但是往往新事物更能适应当前的某些需要,在某些方面更有生命力。

就像大家说人类很多方面越来越倒退了,其实我觉得也不能这么说,凡是所谓“倒退”的方面,一般来讲,总是有其倒退的理由,倒退的好处的,当然也有坏处,但,无疑,好处大于坏处,所以,才能维持继续发展。
  回复  引用  查看    
2005-07-23 14:07 | 双鱼座      
不懂。什么叫纯ORM方案?不纯的ORM方案是什么样子的?
  回复  引用  查看    
#15楼 [楼主]
2005-07-23 14:08 | 蛙蛙池塘      
英语的你也能看懂呀,PFPF,没错,你们已经把软件开发上升到哲学高度了,但是我知道哲学里最大的原理就是实践是检验真理的唯一标准。
  回复  引用  查看    
2005-07-23 14:08 | Teddy's Knowledge Base      
@双鱼座:

你的那个1.3版可能就是属于不纯的orm,呵呵,说笑~~ ^-^
  回复  引用  查看    
#17楼 [楼主]
2005-07-23 14:10 | 蛙蛙池塘      
其实是我瞎说的,我值得纯ORM就是说不写SQL语句,用高级语言查询对象,然后自动生成SQL语句的这种方案
  回复  引用  查看    
#18楼 [楼主]
2005-07-23 14:14 | 蛙蛙池塘      
@双鱼座:
我这篇帖子就是看了你在CSDN回的一个帖子有感而发的,我感觉现在人们弄的框架越来越大,越来越复杂了,我都看不过来了,都说自己的好,而我又意志不坚定,都想看看,看看谁的好用,再这样下去,等我了解清楚哪种方案好,就太晚了,所以我比较倾向于保守的方案,我也不是那种顽固不化分子,对新鲜事务也有所接受,我知道不接受就落后了,可是英语不行,只能看你们翻译的东西了,我刚开始感觉会asp和ado就能写一般的应用了,能挣钱就行了呗,后来感觉这软件真是太难学了。
  回复  引用  查看    
2005-07-23 15:13 | ddd [未注册用户]
进底之蛙
  回复  引用    
2005-07-23 15:43 | idior      
@Teddy's Knowledge Base
第一个说dataset的, 第二个说domain model(你所说的纯or m)的.
不是都是dataset哦.

@蛙蛙池塘
没有深入了解面向对象, 最好别碰o/r m
就像没学数学也不要搞计算机一样. 虽然不学数学也能写程序, 但是理解的很浅,只能做很简单的事.
  回复  引用  查看    
#21楼 [楼主]
2005-07-23 15:47 | 蛙蛙池塘      
楼上的楼上,连字都打错,都不知道谁是井底之蛙,不过你说对了,偶确实是井底之蛙,嘿嘿
◎idior:
这不正在向你们靠拢吗?现在是偶打基础的时候撒,朋友们多多帮助就好。
  回复  引用  查看    
2005-07-23 17:29 | Teddy's Knowledge Base      
@idior:

抱歉,对于,所谓“纯orm”,我也是在该篇文章中第一次看到,前面的评论中引用了一下,纯粹是玩笑话,我声明从来没有评论过“纯ORM”。:)
  回复  引用  查看    
2005-07-24 01:16 | 双鱼座      
@蛙蛙池塘:
哦,大概明白了你的“纯orm”是什么意思了。不过我不太能够认同你的“质疑”。虽然离开ORM一样写程序有时候甚至能写出很漂亮的、性能很好的程序。但是我觉得如果采用ORM可能会更好一些。用SQL语句或者存贮过程来实现业务逻辑当然是可行的,并且是MS目前推荐的方案。但是它真的没有缺陷吗?
我抛开面向对象来和你说点题外话刺激刺激你。现在各种各样的RDBMS都在争夺数据库产品市场。MS当然推荐他的SQL Server了,但是你能说他的推荐你必须言听计从么?如果真的是这样,数据库市场也应该象桌面系统市场一样由Windows几乎呈垄断之势了。但是事实不是这样,我们的客户一样会有可能选择其它的数据库产品。
从十多年前的ODBC开始,大量的数据库引擎开始冒出来,BDE、ADO到现在的ADO.Net。为什么现在大家都抛弃了性能极佳的每个RDBMS所提供的客户端API?甚至连ODBC的API也抛弃了?它们不就明明与ADO.Net干的是同一件事情么?不都是充当一个Port,来与RDBMS对话么?
这是从数据访问的API的发展层面上看这个过程,这个不断的发展的过程其实都是为了一个不变的追求:更好地隐藏细节,让你可以更多地关注单纯的SQL和数据库Schema。再向上进一步,如果连单纯的SQL和数据库Schema都可以隐藏起来,你不就可以更多地关注业务层面的东西了么?
  回复  引用  查看    
2005-07-24 09:16 | cmic [未注册用户]
相对于ORM我更喜欢SQLMapping的IBatis,就是因为IBatis可以更容易使用SQL
  回复  引用    
2005-07-24 15:10 | Yok [未注册用户]
看看java那边吧, 人家照样活的挺好的
  回复  引用    
2005-07-24 19:51 | 听棠.NET      
其实大家谈论ORM时,也没有强调的“纯ORM”,我也是不赞成所谓的“纯”,在一个系统中,数据维护部分可以采用ORM,这可以让开发更具有OO思想,开发速度也大大提高,而且也可以降底BUG率,那重要的就是数据库的无关性,可以实现多数据库透明移植。
而对于系统的另一个主要部分就是查询与统计,这也是系统最复杂的部分,因此ORM在这方面是无法体现出它的优势,反而有缺点,因此“纯ORM”其实是不太现实的。
看看我的SPL吧,就是考虑了这两方面:http://tintown.cnblogs.com/category/12787.html
  回复  引用  查看    
2005-07-25 09:24 | 双鱼座      
@听棠.NET:
你所谓的考虑了两方面其实是指OLTP和OLAP。任何O/R Mapping的解决方案都不能很好地解决OLAP方面存在的问题,更别提你那个简简单单的SPL了。这个与是否纯ORM没有关系。

不过我想说的是,将简单的数据检索及运算(建议大家再不要在o/r mapping中使用“查询”或者“统计”这个概念)放到mapping层,将复杂的检索及运算放到业务层。事实上,在业务层利用对象关系进行所谓的“统计”其实比直接使用复杂的SQL查询更自由、更宽松。
  回复  引用  查看    
2005-07-25 09:30 | 听棠.NET      
@双鱼座 :
我说的就是这个意思啊,在我的SPL中,对于复杂的查询与统计我, 一直是提倡使用SPL语句执行的。你应该是没有详细看我的SPL吧。我的意思是,在我的SPL中,我提倡的就是你说的这种思想。。
  回复  引用  查看    
#29楼 [楼主]
2005-07-25 09:44 | 蛙蛙池塘      
@看了一下你的"SmartPersistenceLayer 2.0即将发布!! "帖子里对SPL2.0的介绍.
功能确实很强大,可是感觉你的描述里有以下问题
实体类自己应该支持保存业务实体信息,以及序列化的一些方法,不应该把CRUD操作放在业务实体里吧,对实体的CRUD操作应该由容器来完成,你的SPL感觉是从EJB的实体bean那边来借鉴过来的,而YOK说的nhibernate中的session.Save(theStudent);这里好像是借鉴的EJB的会员bean吧,不知道你有没有借鉴一些EJB里的CMP模式。
我感觉呀,系统还是不够灵活,你把业务实体的CRUD操作都是自动生成的(看你的介绍哦),这样人为可控制的就少了,你假想每个实体都有CRUD操作,而且都是标准操作了,其实有的实体只有R操作,再进行CUD操作的时候应该抛出异常,而好多CRUD操作不应该标准化,我感觉自己用存储过程写比较灵活,可以让功能更强大,你如果弄成实体的CRUD操作的具体SQL可以在.config里配置我感觉更好,你说的“不需要任何一句SQL语句就实现多数据库操作。 ”恰恰限制了人为的灵活性。
有时候呀,对实体的查询操作会返回好多实体集合,如果太多的话,比如说10000个,如果你再用dataset或者实体数组进行返回的话会造成很大的系统负担,这是不可避免的,系统的数据肯定会越来越大,咱不能不考虑可伸缩性吧,我感觉得设计查询返回datareader或者objectreader之类的东西,当然了这样返回的东西无法序列化,也不容易在多层间传递。
一个业务实体不一定就得和table对应,比如说一个文章表吧,肯定得有CRUD操作,把文章实体ArticleEntity和文章表对应这样没错,但是如果对文章进行高级查询呢?高级查询要置顶文章的几种属性的组合查询,比如说指定文章的标题,作者,关键字,这样就得再做过ArticleQueryEntity,然后给再给ArticleQueryEntity实体创建一个容器,由这个容器调用ArticleQueryEntity的Retrieve操作返回高级查询的结构,而你是用一个Criteria的东西来做到高级查询的,这儿很巧妙,有些象objectspace里的OPath语言,只是对应SQL语句里的WHERE和ORDER字句,但是对SELECT字句和FROM字句没有相关的对应,如果是多表联合查询或者更复杂的处理,肯定还是没有存储过程的优势。
你的SPL中的Entity继承ObjectEntity的方式来实现Entity本身的增删改操作,不知道你这个ObjectEntity是个接口还是类?
实体间的Relational功能反应了实体间的关系,“SPL中目前去掉了Relational功能”,我感觉这也是对的,实体间的Relational应该在业务层反应出来吧,在实体层就自己保存和其它实体的关系,未免耦合性太强了吧。在建模的时候确定概念模型后,确实也应该确定了模型之间的关系,我感觉这些关系应该属于业务逻辑,不应该属于本身的联系吧。
你做的事务处理功能很有用,但是执行事务的时候抛出异常的时候,你的系统是否可以跟踪实体当时的状态,如果执行出错了,你是否能把实体状态和当时的线程信息和上下文信息持久化,以便以后找出错误。在执行CRUD操作的时候,操作所需要的一些参数的值,以及实体的状态,你是否能TRACE。
Query类可以执行很强的查询操作,可以静态执行SQL语句,这个好像做起来就不是纯ORM的感觉了吧,就象谁说的,有点“穿西装打领带,却穿一双拖鞋的感觉。

动态数据源配置 ,多帐套支持 ,内存存储 的功能都做的很合理,很使用,你这套东西功能太强大了,我大略看了一下,说点儿自己的看法。
  回复  引用  查看    
#30楼 [楼主]
2005-07-25 09:54 | 蛙蛙池塘      
@双鱼,您说的对,SQLSERVER的下一带就内嵌CLR了,你可以在SQL里用C#写存储过程,这样数据访问大多都可以写在数据库系统里了,照你的想法,SQLSERVER又走错方向了哦。再下一步面向对象的数据库就要出来了,没有关系型表了,你可以直接对对象数据库做操作了,你对数据库建模也不用弄ER模型了,直接建个类图就既可以生成业务实体,又可以生成数据库了,这不是更好了。有RDBMS提供的API咱不用,非自己抽象出一层。我知道ORM可以更好地隐藏细节,更透明的操作数据库,但是现在的ORM方案也太多了,各具特色,用谁的呀,谁的可信任呀,还是个问号。我知道软件开发发展到现在,人们从以前的“追究执行效率”发展到了现在的“追求开发效率”,ORM确实减少了编码,提高了效率,我不否认,我也接受。我只说说不要用的太过火儿,凡事都想着ORM,ORM用的太纯,影响灵活性了,尽管现在的ORM方案也不断弥补自己的不足,提高自身的灵活性,这都向好的方面发展。
  回复  引用  查看    
#31楼 [楼主]
2005-07-25 10:01 | 蛙蛙池塘      
行了,不讨论这个了,双鱼的kanas.net和听堂的SPL都是灵活性和易用性都很好的ORM框架,偶也非常支持国内的原创framework。偶没有深入了解,现在基础还不行,象idior说的,我该去打基础去,去看看OO,楼上几位给我推荐一本经典的OO的书吧,最好和C#有关联的,我最近再看《程序员》里的一个系列文章《实战OO》,徐峰写的,感觉有些收获,可是具体到设计类的时候我就不行了,对具体语言的OO特性理解的也不到位。
  回复  引用  查看    
2005-07-25 11:35 | 疾风      
ORM这个东西,我与同事也研究了一段时间,最后得出这样的结论:使用.net来开发软件,ORM与非ORM相比,并不具有任何的优势,无论在可维护性、代码逻辑、还是开发速度上都是如此。当然,我们都是从工程的角度考虑问题的,与有些朋友想通过ORM来进行学习的想法不同。

TO idior: 老说别人的OO水平不足、这不足那不足的,仿佛自己水平很高似的--你敢说Anders、微软其他专家的水平不高吗?对于盖茨来说,如果ORM很好可以大幅提供生产力,那么成立一个小组两个礼拜就可以开发出一个很不错的ORM的Framework演示版了吧,为什么Object Space反而取消了呢?想想吧

TO 蛙蛙池塘:呵呵,应该向你学学谦逊的态度。像Bob大叔的《敏捷软件开发》挺能提高水平的。不过我,是从Bjarne Stroustrup的《The C++ Programming Language》开始领悟面向对象思想的。
  回复  引用  查看    
#33楼 [楼主]
2005-07-25 12:50 | 蛙蛙池塘      
◎疾风
是呀,好多经典之做没有看过,什么《人月神话》,《设计模式》,《人件》,《与熊共舞》,《重构》,《敏捷软件开发》啥的,这些都被人说来说去的,偶还没达到看那些书的境界,不过我感觉idior说的对,OO是基础,我想看一本针对C#的讲解OO的书,最好是联系实际一些,比如说具体讲类如何如何设计,如何设计的类更OO,设计类库的时候遵循哪些技巧,哪些规则,哪些指南什么的。
class c1()
{
int a;
int b;
int add()
{
return(this.a + this.b);
}
}
class c2()
{
public static int add(int a,int b)
{
return(a + b);
}
}
c1 myc1 = new c1();
myc1.a = 1;
myc1.b = 2;
Console.WriteLine(myc1.add());
Console.WriteLine(c2.add(1+2));

你们说我写的这两个类,是c1比较OO呢,还是c2比较OO呢?
我刚开始写C#的时候全部是利用的c2那种方式,结果别人说那不是OO,说我还保持着结构化编程的思想,呵呵。
不过现在不是又流星SO(面向服务)了吗?咱不说这是不是一种回归,但是确实SOA为代表的一些松散耦合的开发模式肯定会成为一种趋势。
  回复  引用  查看    
2005-07-25 13:01 | 双鱼座      
@疾风:
我觉得说你是井底之蛙才是比较合适的。

@all:
大家听我来批判他,评判一下,到底是我胡言还是他乱语。
1.既然你懂得软件工程,你应该知道MDA吧,在这方面Borland走在前面。从软件生命周期、Bold、Together建模到现在的ECOII。在这方面Borland因为没有自己的数据库产品也没有自己的操作系统产品,所以观点更中立一些是显而易见的,不一定必须向MS靠拢。但是MDA起点太高,对大多数中小型项目并不合适,所以才有了o/r Mapping这样的妥协方案。“使用.net来开发软件,ORM与非ORM相比,并不具有任何的优势,无论在可维护性、代码逻辑、还是开发速度上都是如此。”这样的结论其实你是没有资格作出来的,因为你根本没有体验过,没有任何事实依据。
2.MS自己要做一个o/r mapping出来的确易于反掌。但是这并不是因为o/r mapping纯粹多余。否则就根本不存在object spaces项目被取消的问题,而是根本就从来不会有这个项目。有可能是一些商业原因。例如:这样的产品对于MS自己的核心产品而言并没有多少利益可言。MS会将这些思想融入SQL Server或者BizTalk Server中,而不是提供一套风险更大的开发框架或者工具。到目前为止,MS还没有一套从模型到代码的强有力的工具,你不能说MS没有这样的开发能力吧。
3.既然要学习蛙蛙池塘的谦逊态度,就不应该用一种不谦逊的口气来斥责别人。
  回复  引用  查看    
2005-07-25 13:11 | 双鱼座      
@蛙蛙池塘:
我从来没有说MS的方向错了呀,反而现在连Oracle都要向CLR让步,推出类似MS的ORP方案。而且,数据库对应用方案的支持越好,业务层将会更稳定、更高效。数据库技术也在发展,应用开发框架也会发展。但是这些发展是不同步的,抽象的好处就是相互可以不依赖,从这个意义上讲,ODBC、ADO、BDE、DbExpress和现在的ADO.Net、BDP都是一种抽象。
  回复  引用  查看    
2005-07-25 13:12 | 疾风      
TO 双鱼座: 呵呵,我的语气确是不太好,写完了自己就察觉到了。“因为你根本没有体验过,没有任何事实依据”这句话,恐怕你也没有资格说罢。其他的,像第2点,我倒是挺同意你老兄的看法,但恐怕微软发现ORM比起现在.net操作数据库的方法来并没有质的提高,也是极重要的原因。



  回复  引用  查看    
#37楼 [楼主]
2005-07-25 13:19 | 蛙蛙池塘      
两位少安毋躁,咱对事不对人哦。别把话说的太有针对性了。
双鱼大侠在软件行业做了十大几年了,经验方面丰富的很,确实,这工具和技术方面的发展已经大大提高了软件开发的效率,这些新的软件开发方法和技术都得你们这些高手领着我们这帮菜鸟才行,虽然MDA,ORM都不是银蛋,可是确实是趋势,我们别讨论大的东西,这有啥用,咱们该讨论具体详细的东西,我在我的原文里提出的一些ORM的问题,好像回帖的朋友都没有正面给予回答吧。
  回复  引用  查看    
2005-07-25 13:22 | 双鱼座      
@疾风:
“ORM比起现在.net操作数据库的方法来并没有质的提高”
这并不是o/r mapping的目标。任何o/r方案都不可能从质的上面提高数据库操作,反而肯定会降低部分效率,或者处处受限。我相信如果你用C++直接调用Sql Server Client提供的API来操作数据库,肯定比任何一种引擎都效率高出许多。
  回复  引用  查看    
2005-07-25 13:23 | 疾风      
蛙蛙池塘写的两个类,如果c2是专门提供算法的类倒是不存在什么OO的问题,这里反而是c2更好了;但如果add有更确切的名称,比如HalfGirth(周长的一半,假设c1是矩形),则是c1更妙了。当然也并不需要事事都OO
  回复  引用  查看    
#40楼 [楼主]
2005-07-25 13:24 | 蛙蛙池塘      
◎双鱼
是呀,数据库和应用框架都有自己使用的范围。
◎疾风
其实我也有同样的感觉,.NET的ADO.NET已经很好用了,与JDO相比我感觉优点更多,所以ORM算是在ADO.NET上的一种更高的抽象吧,但是实际作用不是非常的必要感觉。
  回复  引用  查看    
#41楼 [楼主]
2005-07-25 13:32 | 蛙蛙池塘      
◎双鱼
表走极端,不说那没用的。其实机器码和汇编最快,呵呵。大家也不用做什么偷换命题之类的辩论技巧,就事论事吧,展开的太大没法儿讨论了。疾风说的“质的提高”也不只是说的性能的提高吧,这个“质”太抽象了吧。
◎疾风
关于用OO还是SO,我感觉最小粒度的逻辑还是用结构化编程,比如说某个方法里面的子算法,中粒度的逻辑用OO来设计,比如说类,接口,之类的,再上层,粗粒度的业务逻辑就要用SO来做了。这样更利于企业数据的整合,更容易整合不同架构下的企业数据,可能这个业务是linux + java +oracle做的,那个业务是window2003 + .net +sqlserver做的,而另一些数据则是freebsd上的,这些大粒度的应用不可能做成互相的OO,比说说java上的对象你能集成自.net的基类码?所以还得做成以服务公开的形式。
  回复  引用  查看    
2005-07-25 13:37 | 疾风      
TO 蛙蛙池塘:如果想看C#的OO的书,李维的《面向对象开发实践之路(C#版)
》估计还不错(我看过Delphi版的,虽然第四章的类层次有问题,但整本书感觉还是说到了OO的点上),但恐怕老兄早就过了这个层次了。

TO 双鱼座:老兄真是厉害,招招点到我的死穴上。我的意思是,我们自己在商业逻辑中使用自己的实体类,在操作数据库方面使用微软目前提供方式这样挺好(像蛙蛙池塘说的那样),并不比ORM差

  回复  引用  查看    
2005-07-25 13:40 | 双鱼座      
@蛙蛙池塘:
1.我的确不知道你需要什么样的正面回答。是需要一些案例吗?
2.我不喜欢ORM这种描述。你Google一下,大部分人理解的ORM是对象角色建模而不是对象关系映射。我从来都是尽量回避ORM这个概念。谁让“对象角色建模”这个概念比“对象关系映射”出现得早呢。
3.o/r mapping大家都在探索,我相信包括Borland、MS在内都在探索。如果将软件开发的复杂度仅仅限定在业务层的开发中,而将相对稳定的数据层和表现层做更好的封装,应该是大家共同努力的方向。Borland从前创立的VCL架构和MS的ComponentModel都是这种努力的结果,大家应该相信将来会有更好的结果,或者说一种更好的发展。没有一种软件开发模式是适合所有的人、所有的公司或者所有的平台的。o/r mapping的应用范围也极其有限。
4.与idior的观点不同。我觉得好的o/r mapping方案正是面对所有对面向对象理解不够深厚的人推出的,并不需要太高的门槛。业务层开发人员具有更丰富的素材和途径来实现复杂的业务逻辑。

  回复  引用  查看    
#44楼 [楼主]
2005-07-25 13:47 | 蛙蛙池塘      
好,你说服偶了,偶也看看O/R mapping
  回复  引用  查看    
#45楼 [楼主]
2005-07-25 17:42 | 蛙蛙池塘      
面向对象开发实践之路(C#版)(预订.估价中)
http://www.dearbook.com.cn/book/viewbook.aspx?pno=TS0028668

大哥,这本书没有卖的呀
  回复  引用  查看    
2005-07-25 18:26 | 疾风      
跳票了?我地记得《The C++ Programming Language》中让我对面向对象产生顿悟的话(大体):把概念做成类,而对象就是具体的个体。就如“人”是类,“蛙蛙池塘 ”是对象,呵呵。其他面向对象思想的概念,多态、继承和封装,则是容易理解的东西了
  回复  引用  查看    
#47楼 [楼主]
2005-07-25 18:32 | 蛙蛙池塘      
哪儿这么简单呀,呵呵,你想笑死我呀,把概念做成类。概念只是概念模型,虽然可以用类图来表示,不过那属于需求获取阶段的过程,而画用例图是分析阶段的过程,最后画类图啦,序列图啦,状态图,确定类间关系属于设计部分,这里面理论多着呢,设计了类后,还有模式的应用,代码的重构,单元测试,源码管理,整体了解完了,才能叫理解OO呢,就凭偶现在就知道封装,继承,多态,其实内在意思,啥也不知道呢
  回复  引用  查看    
2005-07-25 19:36 | 寒枫天伤      
追求纯OO,本身就是一种错误
  回复  引用  查看    
2005-07-25 21:42 | 听棠.NET      
@楼主:
好啊,你看了我的SPL,也感谢你提的几点想法,但是我发现我SPL中体现的思想刚好是你没有理解到的。
实体的CRUD,你说不能太固定,业务层面是相当复杂的,但是最终基本上(除查询外)都以实体的CRUD去数据访问,因此不需要SQL需求不仅仅提高了开发速度,而且此有多数据库移植性,我最反对的就是把具体的SQL放在config里,这是最失败的实现方式,因为数据库结构的修改是改不可少的,而一旦修改,你就得修改这么多的XML语句,疯掉。
而对于你提到的一些问题,属于是查询统计方面的,我SPL中本身就不提倡使用实体去查询统计,而是提供最自由的SQL去实现。
我目前的SQL可以透明的支持ACCESS\SQLSERVER\ORACLE等其他的OLEDB数据库、ODBC数据库,开发的高效与透明移植,都来自于实体的无SQL访问,因为SPL会根据不同的数据库类型组装成不同的SQL去执行,这才是从根本上实现业务层与数据库的分离。
当然,其实说到分层,在我SPL的实体层之上,是应该写上一个Facade层的,Facade才是复杂业务的体现,但最终基本上可以使用实体的CRUD去实现。。
  回复  引用  查看    
2005-07-25 23:55 | guoadou      
呵呵 路过 挺热闹的 学到不少东西 各位继续
  回复  引用  查看    
2005-07-27 10:16 | A.Z [未注册用户]
草草了看了ORM的一些代码片断,如果大家对业务层的依赖比较严重,可以去看看德国人做的企业建模Enterprise Architect,我认为如果ORM使用的庞大的持续化机制和几乎完全的对操作表的映射,1。减弱了数据库的业务逻辑,2。大大增加内部对象的原数据。虽然在程序代码里处理业务逻辑和数据逻辑比较方便,但是这很依赖ORM的合理构建。
  回复  引用    
#52楼 [楼主]
2005-07-27 10:22 | 蛙蛙池塘      
我总感觉O/r maping也顶多映射一下标准的CRUD操作,复杂的逻辑怎么映射呀,我晕,就简单的说一下把update某个表里的一个字段,怎么指定是哪个字段呀,还得懂架构吧.
对一个表的操作可能有好多好多种,不可能就CRUD4种,就算CRUD也不都是标准的.
  回复  引用  查看    
2005-08-05 14:24 | 路过 [未注册用户]
O/r maping目前最大的优点就是:多数据库支持。
可是谁家的框架能保证对所有数据库都好,也就几个而已,如果数据库更新了,能否保证框架不变。

我觉得还是ibatis这样简单思想的框架比较好。把注意力集中到关键部分。
  回复  引用    
2005-08-06 17:16 | 听棠.NET      
@路过 :
我说的ORM要多数据库支持,当然目前没有一个能支持所有数据库的,其实也不需要这样的,我说的应该是多数据库扩展更合理些,也就是你当前针对一个数据库在开发,当然OK了,那么以后呢,需要支持其他数据库的时候(除了定制的绝对固定的项目,一般的象产品还有一些项目,以后支持其他数据库的可能性非常大,当然了,如果产品与项目太烂,固然不需要扩展支持的),在支持其他数据库,你的系统需要改动多少呢??有了持久层,只要扩展持久层DLL,业务实体层、业务外观层、表示层什么也不用修改了。这就是我所提的持久层带来的易扩展性。
  回复  引用  查看    
2005-08-20 11:02 | victor_zong      
@路过 :
可以使用设计模式模式达到“保证对所有数据库都好”,添加对新数据库的支持,只需要多写一个类就可以。实际上现在的orm系统也都是这么做的
  回复  引用  查看    
2005-11-23 16:36 | nicklee      
不纯的o/rm
嘿嘿

nicklee.framework里面用的就是
http://mail-ricklee.cnblogs.com/
  回复  引用  查看    
2005-11-24 13:26 | piggybank [未注册用户]
呵呵,其实 ORM 虽然是某种具体实现,背后最重要的还是一个开发模型(也许还不敢说 framework,也不敢说流行的“模式”吧)

而使用或者设计 ORM 的时候,大家争论最多的往往是 该不该 OO,或者 OO 的利弊。但为何不可能是先 OO 再设计数据结构(反思一下,你究竟是否经过了OOA/D才开始设计数据结构?),然后用 ORM 根据数据库 schema 来产生 object class 呢?
所以,有些 ORM 干脆就在如何让你 oo 地设计数据结构方面下功夫,少了中间的一个弯子。

因此,我认为两大主流路线,一则是 ORM 仅仅是为了局部地、部分地提高开发效率;二则是让你能更方便地从头至尾贯彻 OO——但不是彻底 OO,很多应用并不适合用 OO。OLAP 明显,性能要求高的地方也明显。
但,ORM 决不是为了让OO不行的人方便地OO,呵呵

再说,各位不妨说说,“面向对象”谁都能说出它的种种好处,因此成为我们言必 OO 的原因,可 OO 的根本目的和基本原则是什么呢?

事实上,扪心自问,在开发中,我们为什么而 OO ?

未必还有这么多争论了。
  回复  引用    
#58楼 [楼主]
2005-11-25 08:44 | 蛙蛙池塘      
ORM的性能问题迟早会大有改善的,因为现在的数据持久层大多都是关系数据库,所以ORM是一个过渡的东西,如果OODB很成熟了,也就不用ORM了,也不用建立ER模型了,上来就建立静态的域模型,类图,动态的活动图,顺序图,然后就可以开发程序了。
  回复  引用  查看    
2005-11-25 13:53 | piggybank [未注册用户]
呵呵,有时候问题表面上来看解决了,或者“没有问题了”,未必是好事儿。

我之所以这么说,是因为也许我们讨论的很热闹,也轰轰烈烈地排成大队大队的像某个目标前进,而事实上我们可能都并不是真正清除我们在干什么,去哪里?

我曾尝试这样来做一个项目:
1、需求分析、系统设计过程中尽量纯粹地面向对象
2、根据系统设计的对象结构设计数据结构
3、小心地把数据结构映射为原来设计的对象
4、面向对象地开发
完成后,感触非常大的地方是:我们经常自以为自己已经面向对象地思考和开发了,可回头看看我们的类都是从数据结构而来——我们的数据结构则往往是在完成系统分析就开始了!
也体会到了从对象结构设计数据结构,又从数据结构来建立Class的难度——很多地方太灵活了。
才真正觉得,O-R Mapping 使用之核心问题是在这里:你究竟是先 oo 了才有数据结构呢?还是从数据结构 Build 出你的 class?
这也决定我们对 ORM 的需要有两个方面:
降低从 Object 到数据结构,从数据结构到 Class 的思维转换难度,尽可能保证一路畅通地 OO。
否则就是纯粹地提高代码编写效率。

因此,无论是纯粹 OO,还是纯粹不考虑 OO,我认为都没错。
  回复  引用    
#60楼 [楼主]
2005-11-26 08:57 | 蛙蛙池塘      
其实好多时候我们的目的就是为了提高代码的编写效率,现在的硬件技术发展这么快,早就由以前的一味的提高程序运行性能转变到提高开发效率上来了,OO,ORM主要的作用还是为了提高开发效率,而不是性能。

你提到的那个项目开发的过程也是大多数项目用的,刚开始肯定是用OOA,OOD的思想来做需求分析,系统设计,然后根据类模型建立数据库用的ER和EER图,因为程序里要用这些关系数据,所以还要把这些结构化的数据利用ORM包装成业务实体,最后进行OOP编程,现在的开发都是这样的,因为现有的技术和工具所限,其实我感觉也是OO和非OO都能解决特定问题,只是有的场景下使用某个方式更好一些罢了。
  回复  引用  查看    
2005-12-29 12:30 | shuangyuzuo [未注册用户]
我发觉blog里面每篇有那个叫什么双鱼座的人的地方就会有争吵,那家伙说话冲得很,以为自己多了不起似的,老是抓住别人文章里的某一句话,甚至某一个词语的失误来大放厥词!
  回复  引用    
2005-12-29 13:35 | 蛙蛙 [未注册用户]
可不要这么说,双鱼说的大多都是有道理的,我只学过1年编程,好多东西认识不够。
  回复  引用    
2006-03-17 14:59 | 豚豚 [未注册用户]
@ORM
1.对于一个实体的持久化,无非增删改,很容易实现,也很容易维护, 实体的获取 (检索,统计)和 UI 则复杂写。
2.oo非常有用,但好多时候不太好用
3.性能始终是需要考虑的,不然亡羊补牢,晚矣!

  回复  引用    
2006-04-11 18:32 | KevinCheng [未注册用户]
-ORM对于传统的两层架构最大的优势就是使用便利,加上维护方便,极大的缩短了开发时间,所以几乎所有的应用服务器的数据操作层都采用ORM来实现。
-siebel就是如此,尽管理论上ORM效率要低,但经过配置后,完全可以支持起省级和全国级别的应用相应需求,在各个银行和电信行业都是普遍使用的。
-老外的思想其实很简单(再加上财大气粗),既然ORM效率上不容易提升,那就多弄几台服务器,将业务分摊给它们做,再给ORM加上缓存机制,以达到应用需求。

所以,投向ORM的怀抱吧!至于要不要存orm,我看也没有必要。很多老式的oracle应用都将应用逻辑封装在存储过程中,没办法弄存orm的。