前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >我的CMS开发记-2 该ORM就ORM,该写SQL还是写SQL

我的CMS开发记-2 该ORM就ORM,该写SQL还是写SQL

作者头像
用户1687945
发布2018-05-02 11:36:39
1K0
发布2018-05-02 11:36:39
举报
文章被收录于专栏:烙馅饼喽的技术分享

     啊,是ORM还是SQL,这是个问题.

     先扯段题外话,我原来公司的产品是java和.net共存,java部分是外包的,于是么各位也可想而知,两派程序员遇到一块会发生什么事情-____-;;好在大家都是文明人,口水战之后,各取所需,我也是从他们那里得来的MVC,HIBERNATE等等框架方面的概念,从而才得知世界上还有这样的编程思想。当然他们也被本人惊天地泣鬼神的SQL查询功力所震惊

(先吹吹牛再说),无数看似复杂的报表问题在sql语句的魔力下谈笑间灰飞烟灭,两者各有各的好处.

      那么我在开发的时候就遇到这样的问题,ORM能极大地解放生产力,在做后台维护的时候,那代码是无比简洁,而且再也不用去担心什么字段拼错啊,漏字段啊什么什么乱七八糟的破事,只要去管需要实现的功能即可。我们以文章发布模块为例,使用ORM后的开发过程是这样的,我首先创建 文章 的实体类,反正不外乎就是什么标题啊,内容啊,副标题啊,XXOO就那些东西,然后,连表都不用建,直接用实体类就可以生成表,增删查改一应俱全。在展示的时候,使用orm的查询,连sql注入都自动给你防了,看起来真不错。

      恩,是不错。但是这里却有个异常严重的问题,文章录入是当然没有问题,可是在文章列表页,毛病就来了。首先第一个大问题,就是查询问题。文章列表页,只需要显示文章标题即可,大段大段的文章内容根本就用不着去查出来。去查这些东西无疑是极大影响效率。但是这个时候你就会发现:使用orm是处处受制,他要么就是根本就没法定制字段,要么就是非常麻烦。以我使用的Castle ActiveRecord(内部调用Nhibernate)为例,不错他确实可以使用本地sql语句,但是你使用的话必须把字段全部写全,而且时常会遇到莫名奇妙的问题。其实我的要求非常简单,我就只是想取前10条标题,干嘛非要大动干戈绕一个大圈子?好吧反正不就10条文章么,浪费也浪费不到哪去,我忍了。

     但是,如果现在我加点料,我要从某个分类,或者某几个分类里头取头几条,还要考虑置顶,推荐等等因素,这下麻烦大了。activerecord那可怜的一点点查询条件压根没法满足如此复杂(虽然实际上不复杂)的查询,好吧那我用HQL,经过一番研究,hql是写出来了,可是他自动翻译成的sql语句实在是比手写的sql要差了不少,而且使用子查询时写法之晦涩难懂实在是。。。写过就忘了。

     于是经过痛苦的抉择之后,我决定,嘿嘿,遭鄙视就遭鄙视,同时使用sql和orm。orm用于网站后台维护,前台展示,还是使用本人苦练多年的SQL查询,嘿嘿,做人不能忘本是不是,当然了,咱也不能干满页面拼SQL这种太落伍的事情,适当的封装一下,把展示用的页面和数据直接分分开,代码写得清楚一点,也不见得就坏到哪里去,不过执行效率却是上来了。

     由于使用了ORM框架,目前可以同时使用sqlserver和access,其他数据库尚未测试,那么直接用sql查询的页面也需要准备一个数据库访问层,同时支持sql和access或其他,这个大家都会,没啥好说的,根据我以前做财务软件实施维护的经验,其实呢标准的sql语句各大数据库也都差不太多,子查询,连接等语法都是通用的。还是那文章列表来说,无非就是

     select top 10 title from article where ....这类写法,简单明了。

 就select语句来讲,绝大多数需求都能写出各种数据库通用的写法,即使实在是找不到通用写法,那么这时候采用反射等手法来同时支持多数据库,反正sql语句的效率一定比orm来得高啦。

     最后总结一点就是,不要在一棵树上吊死,最关键的是,软件的结构要清晰,执行效率要满意

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2009-01-04 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
机器翻译
机器翻译(Tencent Machine Translation,TMT)结合了神经机器翻译和统计机器翻译的优点,从大规模双语语料库自动学习翻译知识,实现从源语言文本到目标语言文本的自动翻译,目前可支持十余种语言的互译。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档