数据库操作你是喜欢 ORM 还是手写 SQL

2017-09-28 19:58:12 +08:00
 twogoods
说说为什么?还有可以告诉我哪个语言下哪个库超好用吗?想多了解了解,尝试造个轮子,逃...
8973 次点击
所在节点    数据库
111 条回复
lightening
2017-09-29 01:06:21 +08:00
绝大多数情况下用 ORM,需要手写的情况在我职业生涯中应该不超过五次。
手写的维护起来太困难,毕竟写代码的第一目的是可工作,其次是可维护。

ORM 的典范我认为是 Ruby 的 ActiveRecord。
scnace
2017-09-29 01:34:18 +08:00
EricCartman
2017-09-29 02:11:42 +08:00
能 ORM 就 ORM,可维护性太重要
hooopo
2017-09-29 02:43:37 +08:00
OLTP 系统当然 ORM 啦,OLAP 和数据处理相关就手写咯
msg7086
2017-09-29 04:25:11 +08:00
同推 Rails 的 Active Record。

随便贴一段 ORM 中保存前验证的代码感受下。

before_save :check_rules
def check_rules
  conflicts = port_forward_rules.where(exposed_ip: exposed_ip, exposed_port: exposed_port).where.not(id: id)

 # "UDP" only conflicts with "UDP" and "Both"
  if udp?
   conflicts = conflicts.where(protocol: [:udp, :both])
 # "TCP" family never conflicts with "UDP"
  elsif !both?
   conflicts = conflicts.where.not(protocol: :udp)
  end
 
 # No conflicts at all? Great!
  return if conflicts.empty?

  conflict = conflicts.first

 # If they are both HTTP or both HTTPS rule.
  return if ( http? || https?) && conflict.protocol == protocol

  throw(:abort)
end
askfilm
2017-09-29 08:25:57 +08:00
php + doctrine 带你飞
jy02201949
2017-09-29 08:53:43 +08:00
手写
blackshadow
2017-09-29 08:57:56 +08:00
手写 sql
taomk
2017-09-29 08:59:07 +08:00
spring data jpa 基本上只需要继承一下框架提供的模版就可以解决所有的数据库基本操作
nullcc
2017-09-29 09:00:59 +08:00
简单查询 ORM,复杂查询手写
TangMonk
2017-09-29 09:18:03 +08:00
ActiveRecord +1
jjianwen68
2017-09-29 09:31:46 +08:00
用 jpa/hibernate,但只做基本方式的映射,不习惯多表关联,复杂一点的查询就直接 hql 或者原生 sql
CuminLo
2017-09-29 09:35:27 +08:00
喜欢手写 SQL,但是必须绑定参数来查询。
至于为什么,可能是之前受过重构的伤,老项目迁移到新框架那些 ORM 迁移,现在想想都心累.....
linxl
2017-09-29 09:38:24 +08:00
laravel eloquent 蛮爽
Hozzz
2017-09-29 09:41:03 +08:00
@IllBeBack 手写和注入有什么关系?注入不应该是在连接数据库之前清理的?
assad
2017-09-29 09:58:51 +08:00
@askfilm doctrine 用起来啰里八嗦,还不如 illuminate 的呢
baoanlol
2017-09-29 10:00:43 +08:00
用过 hibernate,不好用,后来用 slick,喜欢。。。
ybh37
2017-09-29 10:00:49 +08:00
还是要看具体的业务场景,如果是实体关系简单的业务,ORM 就很好用。
相反,以下十分复杂的而且对性能有要求,一般会选择 SQL SP
timwei
2017-09-29 10:01:02 +08:00
@msg7086

只是做字段筛选为什么用了 conflicts = conflicts.where(protocol: [:udp, :both])
而不用 conflicts = conflicts.select{|t| [:udp, :both].include? t.protocol }

where 方法会多刷了一次 query 呢
resturlaub
2017-09-29 10:08:45 +08:00
直接用 sql 或是用 ActiveRecord 应当是思维上的区别吧。

用 sql 的时候思考的是用一个语句得到数据,之后不管是把数据转成对象还是直接当数据来用,取数据的过程就是类似于面向过程的思维方式。

用 ActiveRecord 则全然不是这种思维方式,而是将一个数据表理解成一个类,从中抽出许多对象,得益于此一个对象的属性还可以是其他类型的,如数组,而用 sql 语句的话在存储前和读取后还需要转化,还有其他 enum 等等的特性。
还有就是代码容易读,比如用 sql status = 1 这是为什么就比较难理解。

用好 ActiveRecord 还是需要能够很好的理解 sql,这样才能理解迭代器啦,lazy load 在 ActiveRecord 是怎么实现的,才能在使用 ActiveRecord 是不会出现性能差的问题,而且用 ActiveRecord 可以更加良好的封装,同样的语句可以较好的使用数据库的缓存,也便于理解。

用 rails 之前特别喜欢写 sql,感觉写出一个高性能的 sql 内心十分之爽,后来用了 rails,使用 ActiveRecord 的同时内心还是同时想着形成的 sql 是怎么样的情况,同时也会学习到 ActiveRecord 处理后的生成的 sql 可能比我以前手写的 sql 更为好。

至于哪个好,我个人觉得这两都是基本功吧,没有场景讨论哪个好没有任何意义。有时 sql 好,够直接,爽。有时 ActiveRecord 好,易理解,爽。建议都要会。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/394442

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX