随心所欲

做个幸福的人
posts - 141, comments - 1288, trackbacks - 19, articles - 0
  博客园 :: 首页 :: 新随笔 ::  :: 订阅 订阅 :: 管理

扬长避短,适度使用ORM.

Posted on 2007-01-06 13:26 随心所欲 阅读(11232) 评论(10)  编辑 收藏 所属分类: ORM/DB

ORM是一个高效的开发辅助工具。他有先进的映射思想(相对于普通的DataTable映射)。但是同时也要记住,他只是一个工具,他有它存在的理由,也有它的不足。

没有任何一个工具是万能的,这个大家都可以理解。我们如果使c语言来卡发网站,或合用c#去做底层游戏开发,我们都会遇到问题,但能说明什么?能说明c或者c#是垃圾么?显然不可以。ORM也是如此,他有他的不足,但是不能简单的就评价他如何。

下边通过我的一些理解来说一下ORM(我用的是WilsonORM,两年多)。

 

ORM的出现背景:

软件开发,我们已经知道了OO思想对于我们发开的意义(把现实的物体变成程序里面抽象的对象(类),让我们的开发可以变成一种对现实社会的模拟。通过这个模拟,代码不再无聊,对象让他变得优美起来。各类对象让我们的软件变得丰富多彩)。但是对数据库我们去无能为力,他只是一个二维网格,这就是他唯一的一个结构。怎么才能让这个没有情调的东西适应或者“伪”适应我们这个优美的OO呢?

于是乎,ORM出现了。他比较巧妙的解决了这个问题。他把Table应设成一个类,把一条数据应设成这个类的一个实例。反过来,把这些实例再度转换成数据行,操作到数据库。

数据库ß->ObjectSpace,NameSpace

数据表ß->Class

数据行ß->Instance (object)

数据列ß->属性

数据操作ßà类的方法

ORM的特点

   看,通过这个映射之后,我们得到了一个什么样的结果。数据表成了一个个我们熟悉的对象,我们完全可以这样理解我们的模型。

ObjectSet users=Space.GetObjectSet<User>(“userId>100”);

(users[2] as User).Name=”xxx”;

users.Persit();

从这里看,我们不再关心什么数据行列了,只是对于对象的操作就可以。

ORM的优点

  1:模型化数据表,使逻辑更清晰,容易理解。

这个优点就是刚开始提到的那一个,把二维的数据表映射成对象,这样的开发看起来要清晰一些,比起全都是行列来。

  2:快速开发。

对于数据库常用的操作,无非就是CRUD。创建、修改、删除都可以使用ORM方便的来操作。对比这两段代码:

  string sql=’update T1 set (xx=xxx,xxxx=xxxxx)’;

 

  T1.Xx=XXX

  T1.XXX=XXXX

  T1.Persit()

如果字段表比较少,还看不出区别,如果字段有几十个,那么用字符串就显得很麻烦,并且还容易写错。而如果使用了ORM,至少类的属性可以地动提示了,出错的机会少,并且代码看起来漂亮多了,易读易维护。

对于取数据集操作,ORM就力不从心了。它可取出一个表的数据,但是在数据表连接,取得特定字段等方便就显得很弱。更不用说一些复杂sql的执行了。

  3:其他辅助工具

ORM提供了很多其他操作函数,用以补救他的弱点。不同ORM提供的不一样。WilsonORM提供了这样一些函数:

   ExecuteCommand();

    ExecuteDelete

    ExecuteScalar

    ExecuteUpdate

GetDataSet  //可以执行复杂的sql。

GetObjectCount

还有就是提供了不同数据库类型的Connector,还有数据库分页技术等(这个功能很有价值)。

ORM的不足

  1:取数据的灵活性

比方说:多表连接。这一个在orm里面就无法实现(很难实现)。而这个有非常常用,特别是在作统计的时候。

比方说:取出的垃圾数据(只想取得某一列,但是orm是取出全部的)。

  2:运行速度

    由于orm要做很多操作,映射对象之类的,所以必然要消耗一些系统性能。这个也可以理解,快速开发,必然运行效率受损。

如何使用ORM

  扬长避短。适度使用。

  1:大量数据表的简单的操作全部使用ORM。一般的操作,特别是插入、修改、删除等操作,使用ORM,快速方便。

  2:对于需要灵活操作的模块使用其他方法。比方说使用多表连接,或者其他复杂sql的逻辑等,就需要使用其他工具。

 

结:

合理使用ORM,就是“扬长避短”的一个过程。这是一个通用的对待工具的态度。只有这样理智的对待ORM,我们才能从中获益,让工具为我们服务,而不是我们为工具所累。

Feedback

#1楼    回复  引用  查看    

2007-01-06 22:29 by kiler      
关于取数据的灵活性这个问题,可以依靠编写视图再映射来解决。

#2楼    回复  引用  查看    

2007-01-07 01:34 by Zhongkeruanjian      
楼主分析得有道理。ORM不是万能的(除非面向对象的数据库出现)。

我个人认为ORM适合企业业务系统,并发小,性能上不用太多的渴求。

1 业务逻辑组件用ORM,清晰自然,数据量不会很大。
2 但界面的列表(多半是多表联合查询出来的列表),就一定用ADO.NET ,比如
EntLIb 3。

#3楼    回复  引用  查看    

2007-01-07 13:29 by kiler      
多表联合查询以及复杂的sql查询完全可以设计一个视图进行查询然后把这个视图映射到一个实体类搞定,没有必要再别扭用ado.net处理了。

#4楼    回复  引用  查看    

2007-01-08 10:09 by 黑马      
有道理,业务千丝万缕,不可能一分切,全部采用ORM

#5楼 [楼主]   回复  引用  查看    

2007-01-08 14:21 by 随心所欲      
@kiler
ORM要的就是一个简单,如果做得太复杂,无所不包,反而失去了他的特点。

#6楼 [楼主]   回复  引用  查看    

2007-01-08 14:23 by 随心所欲      
@Zhongkeruanjian
正是这个意思。
如果渴求工具来做所有的工作,还要我们这些人干什么?我们的价值在于实现用户的商业逻辑,用合适的工具来帮助我们实现。

#7楼    回复  引用  查看    

2007-01-11 14:17 by 左轮      
好文

#8楼 [楼主]   回复  引用  查看    

2007-01-11 18:33 by 随心所欲      
原来我也以为是好文,直到看见人家写的更好的
比方说那个“ORM之硬伤”的文章。
@左轮

#9楼    回复  引用    

2007-05-11 14:51 by ukyoxh [未注册用户]
其实对于企业应用最重要的还是低风险

使用了一段时间的IBATIS后发现和TransactionScope一起使用的时候会报错,所以放弃使用了,因为有的时候方便是方便,但是如果万一产生一些风险却承受不起,个人看法!!

#10楼 [楼主]   回复  引用  查看    

2007-05-11 15:04 by 随心所欲      
@ukyoxh

同意。低风险。
现在的ORM还好了,主要是适度。

标题  
姓名  
主页
Email (只有博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2007-01-06 13:37 编辑过


相关链接:
所属专题: ORM
 




Google