BT

如何利用碎片时间提升技术认知与能力? 点击获取答案

你正在以错误的方式使用ORM

| 作者 Jan Stenberg 关注 29 他的粉丝 ,译者 马德奎 关注 0 他的粉丝 发布于 2014年9月20日. 估计阅读时间: 3 分钟 | GMTC大前端的下一站,PWA、Web框架、Node等最新最热的大前端话题邀你一起共同探讨。

团队弃用一种对象关系映射框架(ORM),因为他们认为它性能不够好或者增加了太多不可知的因素,但那通常是由于用法不对。在最近的一次演讲中,Jimmy Bogard着重强调了在使用ORM时他认为正确和错误的方式,其中包括映射和查询问题。

Jimmy是AutoMapper的创建者,同时也是一位微软最有价值专家。他将ORM描述成一种从数据库获取数据并传递给应用程序以及将数据传回数据库的工具。这可能看上去是个简单的问题,但实际上却相当复杂。

Jimmy描述的一个映射问题是数据库生成的映射代码,即由工具从现有的数据库创建代码。这看上去可能很有吸引力,但他通常会发现,其中有太多的关系和不必要的导航,这会产生性能问题。相反,Jimmy使用代码优先的方式,添加他们需要的映射和关系,即使对于已经存在的数据库,也是如此。

以Jimmy的经验来看,在使用ORM时,开发人员抱怨的第一件事往往是过度延迟加载和Select N+1加载,这些特性会使ORM延迟加载一个复杂模型中的所有数据,而不是按需读取数据。问题在于,那可能会导致许多数据库调用,例如,一次读取一个属性或者在集合上循环时。相反,Jimmy更倾向于尽可能多地使用“预先抓取(eager fetch)”,在一次请求中读取所有需要的数据。

Jimmy认为,Repository模式并不是一个好主意。在《领域驱动设计》原书中,Repository原本是一个接口,看上去像数据存储上的一个集合,但Jimmy认为,这种模式已经演变成ORM之上的外观模式,隐藏了许多ORM特有的特性。在这种模式下,Repository只是一个愚蠢的接口,有一个仅仅作为实际ORM代理的实现。要有效地使用ORM,就要使用这些隐藏的特性。这会使ORM的实现细节暴露给应用,使Repository成为ORM上一个中看不中用的包装器。

作为Repository的替代方案,Jimmer更倾向于将处理特定请求的所有代码放入一个类中,从而将每个数据请求建模成一个命令或者一个查询。这样,变化,比如一种新的数据访问策略,就封装到一个特定的类中。

Jimmy提到的最后一个糟糕的观念是忽略SQL。ORM不是一种避免了解SQL的方法,对于运行在ORM上的关键业务系统,知道什么SQL在运行以及它的性能如何是很重要的。

查看英文原文:You Are Using the ORM the Wrong Way

评价本文

专业度
风格

您好,朋友!

您需要 注册一个InfoQ账号 或者 才能进行评论。在您完成注册后还需要进行一些设置。

获得来自InfoQ的更多体验。

告诉我们您的想法

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

如何落实... by Chen Senkai

无具体举例及实际使用说明,验证。不足以转变观念。

支持这种想法 by Zhang Sandy

这个想法与我的想法不谋而合,如果我们在抱怨ORM效率时,其实应该反思我们的模型是否已经出了问题

支持这种想法 by Zhang Sandy

这个想法与我的想法不谋而合,如果我们在抱怨ORM效率时,其实应该反思我们的模型是否已经出了问题

支持这种想法 by Zhang Sandy

这个想法与我的想法不谋而合,如果我们在抱怨ORM效率时,其实应该反思我们的模型是否已经出了问题

支持这种想法 by Zhang Sandy

这个想法与我的想法不谋而合,如果我们在抱怨ORM效率时,其实应该反思我们的模型是否已经出了问题

支持这种想法 by Zhang Sandy

这个想法与我的想法不谋而合,如果我们在抱怨ORM效率时,其实应该反思我们的模型是否已经出了问题

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

6 讨论

登陆InfoQ,与你最关心的话题互动。


找回密码....

Follow

关注你最喜爱的话题和作者

快速浏览网站内你所感兴趣话题的精选内容。

Like

内容自由定制

选择想要阅读的主题和喜爱的作者定制自己的新闻源。

Notifications

获取更新

设置通知机制以获取内容更新对您而言是否重要

BT