分享

所有设计复杂的ORM都是浮云

 quasiceo 2013-10-04

所有设计复杂的ORM都是浮云

很久没有写文章了。

一直很忙,不是很有时间整理。

今天主要是来吐槽下那些设计很复杂的ORM的。

项目做的越多,越觉得ORM这个东西设计的太复杂实在是没什么意义。

比较推崇Dapper这样比较简单,效率比较给力的是ORM。

他其实什么都没做,只是把数据库的字段映射到对象的字段上,我觉得就这一个功能就OK了。

其他的功能对ORM来说基本上都是没什么用的。

待我慢慢道来!

 

一行只写一句话,是因为写C#代码习惯了,不是诗, 不要误会!

 

你说你的ORM支持全数据库。

啊哈,一般来说项目开始的时候数据库就已经选好型了。

只要你不是非常二逼或傻逼,选一些非常不入流,而且能力不是很强的数据库。

后面基本上是不会更换数据库的。

所以,为毛要支持啊。

在通用和性能之间,有一条沟,你要么站在沟左边,要么在沟右边。

站中间,哈哈,掉下去了。

你说你开始的没想到后面会有这么大的数据。

啊哈,你的架构师不给力么!

好,不是架构师的问题。

穷逼的,牛逼的MYSQL。

苦逼的,牛逼的MSSQL。

二逼的,牛逼的ORACLE。

傻逼的,牛逼的DB2。

大家一开始都是在考虑当前的需求。

并且稍稍的考虑的下未来几年的可能,或者没有考虑。

所以不能怪架构师,谁让甲方刚开始只给那么点钱。

好了,时间越来越久,数据库越来越慢。

肿么办?

升级数据库哈!

这不,你看还是有换数据库的需求的吧。

啊哈,怎么说呢?

总觉得换一种数据库就能解决问题?

世界上著名的数据库就那几种!

在一些特定的领域

ORACLE比MSSQL牛逼多少?

MSSQL比MYSQL牛逼多少?

牛逼不了多少的哈

没见上边么,每一种数据库都有牛逼的人在用么

你觉得你的数据库不行!

你调优了么?你优化业务了么?你还在用奔腾时代的机器来挑战这大数据时代么?

所以,换数据库是最最坏的打算。

而且你就算想换,现在的ORM也解决不了100%的问题啊。

数据迁徙,要专业工具!数据库管理,要专业人员!

所以你想用一套东西来解决所有问题。

上帝尚不能造一块自己搬不起的石头,何况是你!

 

 

你说用了ORM,妈妈再也不用担心的我SQL了!

啊哈,怎么吐槽你呢?

好的开发人员有四个技术基本功,知道么!

开发语言,SQL,抽象能力和自嘲!

不会任何一样,你都不是一个好的开发。

会拿开发语言写函数,会自定义对象,会拿语言表述一套完整的业务流程。

不错!很不错!

但是你还差三样!

你起码要会写函数吧!知道怎么拿SQL自定义类型吧(对不起,主流数据库都支持的哈)!会用存储过程来表述一套完整的流程吧!

但是你差两样!

你说你已经写了一套ORM可以通吃所有数据库啦!

呵呵,不错!来,学着星爷的腔调来一句,“其实我是一个程序员”!

哦也,你功德圆满,随你师父和大师兄,三师兄以及小白马回大唐去吧!

什么!

你说不要把业务放到数据库里面,换数据库不方便!

骚年,从头看看。

好,你已经看过了,但是你还是觉得放到数据库里不放心,你还是可能换数据库!

各种主流数据库的表主流的字段类型基本可以通用哈。

各种主流数据库的函数和存储过程的调用都差不多哈。

各种主流数据库的你有的基本大家都有哈。

只要不使用太特殊的东西,换个库神马的,小case啦。

你说你用了!

你说你用了ORACLE的包,Java Source!你想换!

你说你用了MSSQL的表变量,C# UDT,花了好几千大洋装上了R2!你想换!

你说你用了MYSQL的枚举,对InnoDB疼爱有加!但是你想换!

.......

少年,为什么要放弃治疗!

都这样了,都沧海桑田了,你还是好好珍惜你们的感情吧。

换啥!换一种思维来解决问题吧,坑挖的越来越深的时候,就该想想是不是改往宽挖挖了!

就算非得换数据库,你真的以为,自定义的那套别扭的语法能为你新的数据库带来很好的性能么?

说我了解的,只说最简单的,而且通用的语法层面!

CTE这么好用的东西,你来,用ORM生成一条试试看。

MERGE这么好用的东西,你来,用ORM生成一条试试看。

SQL BLOCK这么好用的东西,你来,用ORM生成一条试试看。

(注:SQL BLOCK是ORACLE的叫法,MSSQL原生支持所以没有太V587的名字)

为什么非要各种数据库的方言上做痛苦的挣扎?

你确实练就了一身无敌的抽象能力,你确实碉堡了!

但是,呵呵,别忘了那句,“我是程序员,你叫我序员就好了”,生亦何欢死亦何苦哈,何必非要和自己过不去呢,是不!

 

你说你是处女座的,而且你还是个苦逼的后端程序员!

你是说你见不了后台代码里,被SQL玷污的满目疮痍的开发代码!

啊哈,SQLSHOP听过么,把SQL全部放到外置文件里进行统一管理,所有的查询都是按照绑定变量的方式进行。

从不拼SQL,从不把SQL写到代码里,复杂的业务写成存储过程或函数。

SQLSHOP让你的代码一尘不染。

SQLSHOP让你担心的注入问题,执行计划问题轻松解决。

SQLSHOP让你在写代码的岁月里幸福的像花儿一样。

那什么地方有SQLSHOP呢?

啊哈,刚好本仙身上带了一包,暂给元帅尝尝鲜,涉及一些不太方便的代码,请自行脑补。

SQL class
SQLPath class
SQLShop class
demo

 

(SQLSHOP的思想不是做一个ORM,而是做一个SQL的管理器,统一管理这些SQL,而不是凌乱的散落在各个class文件里面。)

 

你说我总算发现了,你对我们这些功能齐全的ORM有偏见!

啊哈,你说对了!

不过我的偏见是有理由的哈!

关系本来就是该数据库来处理,RDBMS的第一个R就是指关系,这个关系是说数据之间的数据关系。

OO语言里面也有关系,不过是对象关系,虽然可以将数据关系按照某个原则转换到对象上!

但是为了按照数据关系来组织数据对象总感觉不是那么美好!

NH已经不是那么火热了!

LINQ TO SQL也已经在慢慢消失。

EF虽然活着,但只是活在很多小的项目,或者懒的开发人员那里。

要想一套很好的ORM,想想NOSQL吧!

只需要单表映射,不要再把复杂的关系组织到OO上了。

就算某天觉得关系型数据库不给力了,想换NOSQL。

噢耶,程序里面全是单表操作,so easy!

 

珍爱生命,远离复杂的ORM!

那怎么判断一个ORM是否复杂呢?

1.全部使用对象的方式来操作数据库。(按理说,所有的开发人员应该都是见不到物理表的,所见的只能是视图,函数,或存储过程)

2.由机器自动生成SQL并执行。(EF生成的SQL好么,你用一张C#的内存表关联一张数据库的一张表试试看,那长长的SQL,那淡淡的忧伤)

3.包含复杂的查询语法,企图用一套自己的语法来通吃所有数据库。(你明白的,通吃有用?学习啥语法都不如学好SQL,数据库就那几种,SQL都差不多的)

4.不承认我上边说的的,还执迷不悔的,就当我啥都没说,我没有在说你哈!

posted @ 2013-09-30 11:17 Code Monk 阅读(1673) 评论(27) 编辑 收藏

评论列表
  
#1楼 2013-09-30 12:01 *深海  
本人也不怎么喜欢ORM。
但如果是做通用类产品的话,我还是比较建议ORM的,有时候部署到客户那边的时候,他们就是会指定数据库,你只能支持单一或者需要很大额外成本进行数据迁移,那很有可能就没戏了。
做项目就真的不用那么纠结了,怎么爽,怎么快,怎么来吧
  
#2楼 2013-09-30 12:07 钧梓昊逑  
  
#3楼 2013-09-30 12:17 asxinyu  
不赞同,你可以不喜欢用,你的理由也可能适合你,但不适合所有人啊
  
#4楼 2013-09-30 12:39 KindFace  
完全赞同楼主观点,我从来不用关系映射组件。
  
#5楼 2013-09-30 12:55 dax.net  
要看做什么样的项目,采用哪种架构方式的。如果是项目规模较大,软件业务复杂度相对较高的情况下,你不得不采用面向对象的方式来思考这些业务和需求,于是,直接将业务对象保存到数据库中,会比Direct SQL要更加方便快捷,此时,ORM就会显得特别重要。此时损失的是系统效率,获得的是稳健的业务处理能力。
  
#6楼 2013-09-30 13:29 zsea  
实在没看完。
  
#7楼 2013-09-30 13:32 深蓝医生  
ORM的本来目的是让开发过程更OO,是先有对象,再有表,也就是CodeFirst。
诚然,现有的很多ORM都过于复杂化了,把数据库的那一套约束又搬到了实体类中,不管是通过XML还是特性方式,甚至要求实体类必须有主键。这种约束限制了ORM的灵活性,有时甚至影响效率。如果想要做到SQL那样的灵活性和高效率那么必须有类似的查询API。Linq 就是这样的查询API,还有PDF.NET的OQL,一种更接近SQL的查询API。
尽管有的ORM系统有自己的查询API,但仍然不能解决所有问题,比如数据库特定的查询和数据库函数,或者ORM输出的SQL过于沉长,此时使用SQL无疑是最佳选择,所以我认为一个复杂系统,ORM只能解决80%的问题,剩下10%的复杂查询应该由SQL来解决。楼主的SQLSHOP是一个好方案,PDF.NET开发框架的SQL-MAP技术与此类似,使得SQL集中化管理,而且还能够自动生成代码。
还剩下10%的查询怎么办?用不着ORM这么重量级了,也不比手写SQL,用数据控件吧,一套良好封装的智能表单控件,使得只需1行代码即可完成表单数据的CRUD。

总之,是否有必要用ORM,用简单的还是复杂的ORM,要分情况来实施,不能太极端,在开发效率、维护效率、运行效率之见取得一个平衡。
  
#8楼 2013-09-30 13:36 路过秋天  
orm的核心重点是开发效率。
  
#9楼 2013-09-30 13:42 杨义金  
希望你永远坚持这个观念。只有你遇到了问题才会想到“如果当时选择。。。,现在也就不会。。。”
  
#10楼 2013-09-30 13:42 asxinyu  
你博客的“反对”按钮哪去了?不要只放支持按钮啊
  
#11楼 2013-09-30 13:46 紫砂壶  
话说,楼主口中的ef,linq to sql哥还没来得急用,就过时了??我是该高兴呢还是高兴呢。。
  
#12楼 2013-09-30 14:20 在路上—书生  
看见楼主的吐槽是在说出了我的心声,什么狗屁ORM用着项目卡的不像话,复杂点的操作要进行好多步操作,执行个update还要先查询一遍在更新回去,而且还是全字段更新,要是sql一句搞定。想要的功能只是我穿进去sql返回对象就形成了
  
#13楼 2013-09-30 14:41 深蓝医生  
@在路上—书生
没有找到正确的ORM。
试试PDF.NET,只需要查询一次:
1
2
3
4
5
6
7
8
9
10
11
Users user = new Users() {
                AddTime=DateTime.Now.AddDays(-1),
                Authority="Read",
                NickName = "菜鸟"
            };
            OQL q = OQL.From(user)
                .Update(user.AddTime, user.Authority, user.NickName)
                .Where(cmp => cmp.Property(user.RoleID) == 100)
                .END;
EntityQuery<Users>.Instance.ExecuteOql(q);
  
#14楼 2013-09-30 14:44 民工也外语  
顶。。。。。。。
  
#15楼 2013-09-30 14:50 kiler  
无知无畏
  
#16楼 2013-09-30 14:51 Highflyer  
一行只写一句话,是因为写C#代码习惯了,不是诗, 不要误会!
哈哈!
  
#17楼 2013-09-30 15:03 zetee  
都是明白原理的人.知道优劣势所在.正确应用上去,能提高开发效率.一味的排挤,说明个人领悟深度不够.不能怪别人.只能怪自己没大胆在技术上面突破.
  
#18楼 2013-09-30 15:54 CamelOnTheWay  
万般皆在心,万物皆在手。使用ORM的原因除了一些做通用系统的,还有就是工具而已。没有人会赞同不掌握基础就只掌握工具的吧!
  
#19楼 2013-09-30 16:13 地狱门神  
反对复杂数据库,反对SQL语言,反对存储过程。
  
#20楼 2013-09-30 16:20 flyher  
@ Code Monk
"四个技术基本功,知道么!
开发语言,SQL,抽象能力和自嘲!"
赞同!
  
#21楼 2013-09-30 17:08 lindping  
做通用产品,兼容主流数据库是必须考虑的。比如最常见的oa,买你产品的客户,sql server和oracle基本一半一半,做项目的时候,甲方出于版权、技术优势、平台等各个因素,中途更换数据库也是常有发生的。所以不要说支持多数据库没有用。在代码里看不到带数据库类别的元素,干干净净的,切换数据库时只需修改一下配置文件,有何不好呢?
复杂的多表联合查询确实不适合用orm。因为这种情况下orm用起来比sql复杂多了,但是单表的操作,还有一些用于显示数据的只读操作,用rom赏心悦目多了,配合缓存技术,性能也过得去。

一句话,用orm没有什么不好,不好的是什么地方都用orm。
  
#22楼 2013-09-30 21:37 Wind4  
没有错误的技术,只有错误的用法。选择最合适才是王道。
  
#23楼 2013-10-01 00:35 光锥之内就是命运  
@Wind4
确实
有人就是典型的用电锯去杀鸡 然后说电锯毫无用处
  
#24楼 2013-10-01 01:33 桀骜天涯  
CTE这么好用的东西,你来,用ORM生成一条试试看。

MERGE这么好用的东西,你来,用ORM生成一条试试看。

SQL BLOCK这么好用的东西,你来,用ORM生成一条试试看。



======================================

LZ,不是做ORM的就不懂CTE,MERGE,这完全是不合乎场景的,如果你需要MERGE你会用ORM?你学习指针会选用JAVA语言?
会ORM不等于不会SQL,函数,存储过错等。

LZ,ORM的诞生不是为了替换调函数,存储过程之类的,而是为了敏捷开发。OK?在天朝加班赶项目是常有的事,会有希望将常用的东西封装起来调用,调用不代表他不会原理。。

你这文章是没道理的,现在一辆设计复杂的自行车价格好几万,但是自行车再快也比不过1万块钱的摩托车,你能说自行车就是废物么?
1
2
3
4
var mql=ScoreSet.Select(ScoreSet.ScoreM.Sum().AS("sum"),ScoreSet.TypeName).
Where(ScoreSet.ScoreM.BiggerThanOrEqual(100)).
GroupBy(ScoreSet.TypeName).
Having(ScoreSet.ScoreM.Sum().BiggerThan(300));

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多