Rails 3中的DataMapper vs ActiveRecord

28
我想知道你们对DataMapper有什么看法,相较于Rails 3中改进后的ActiveRecord它带来了哪些好处。
感谢您的意见。
2个回答

11

我更喜欢使用DM而不是AR。我感觉DM实际上是一个ORM,而AR只是SQL的包装器。DM使切换数据存储非常容易。DM的查询语法更加统一等等。SEL(策略性贪婪加载)也使DM看起来更像对象存储而非AR。

此外,DM类事先定义属性使得代码更易读。自从使用DM,我再也没有错过迁移。(即使您真的需要它们)。在Rails 3中,我几乎完全使用DM。


你们不觉得实现DM的成本太高了吗?就那些你可能想要使用的宝石而言,它们假定你有AR,然后你需要黑客攻击这些宝石等等。例如,Devise是一个很好的用户认证宝石,但它需要AR,尽管已经有第三方devise-dm宝石,但它是第三方的,谁知道他们什么时候会停止支持它或者Devise在没有更新包装程序的情况下何时会更新。这只是一个例子。 - Ivo Sabev
3
devise-dm运行良好。DM还有许多第三方的gem包。随着时间的推移,随着DM的发展成熟,这些问题将逐渐消失。 - piyush
我还没有看到一个能够处理类表继承的ActiveRecord,而DataMappers似乎可以。有人能证实吗?谢谢。 - Neil McGuigan

2

我在Rails 2中使用Active Record,在Merb和Rails 3中使用DataMapper——现在我每天都使用DM/Rails 3。我已经阅读了AR3的相关内容,但只在一个小项目(内部应用程序)中使用过。

我发现我真正关心的唯一区别是DM的strategic eager loading。它很少做到人们所希望的,而且它所做的(正确或错误),它都是用FM完成的。

使用AR的显式预加载,就没有什么疑问,它会说出它要做的事情,并且(通常)会做到。

虽然“自动”预加载听起来不错,但我发现它对我有两个负面影响:

  1. 搜索过多查询的来源需要花费不菲的时间
  2. 代码中充斥着伪预加载的hack,其中关系被实例化和丢弃,只是为了使它们和标识映射以某种方式准备好,这种方式有时并不能“粘合”并且永远不会自我记录。

否则,我发现AR和DM是相同的东西,只是有不同的点。与像Sequel这样的东西不同。


你使用Sequel吗?如果不是,为什么不使用? - gucki
1
@gucki 我在一年前的一个项目中使用过它,但之后转向了 DM。我真的不太记得我们当时遇到的问题,我认为可能是在持久化之前处理关系的问题,但我不想发誓。我确实记得 Sequel 本身没有任何问题,例如错误,而问题是设计阻抗不匹配。如果我今天开始一个新项目,我肯定会再次审查 Sequel,因为我现在非常厌倦 ORM 的谎言。 - Yuri Gadow

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接