ORM是啥意思?
Posted
技术标签:
【中文标题】ORM是啥意思?【英文标题】:What's the meaning of ORM?ORM是什么意思? 【发布时间】:2009-07-05 09:19:31 【问题描述】:我曾经基于 python 框架 Django 开发过几个项目。它极大地改善了我的生产。但是当项目发布后,访问者越来越多,db就成为了性能的瓶颈。
我尝试解决这个问题,发现是 ORM(django) 让它变得如此缓慢。为什么?因为无论您使用什么数据库后端,Django 都必须为程序员提供统一的接口。所以它肯定会牺牲一些 db 的性能(将一个原始 sql 制作成几个 sql,并且从不使用特定于 db 的操作)。
我想知道 ORM 绝对有用,它可以:
-
为程序员提供统一的 OO 接口
使 db 后端迁移更容易(从 mysql 到 sql server 或其他)
提高代码的健壮性(使用ORM意味着更少的代码,更少的代码意味着更少的错误)
但是如果我没有迁移的需求,那么ORM对我来说意味着什么?
ps。最近朋友告诉我,他现在所做的只是将ORM代码重写为原始sql以获得更好的性能。太可惜了!
那么除了我上面提到的之外,ORM 的真正含义是什么? (如果我犯了错误,请纠正我。谢谢。)
【问题讨论】:
我认为你的意思不是“意义”,而是“价值”? 【参考方案1】:当您列出 ORM 的好处时,您基本上已经回答了自己的问题。您肯定会遇到一些优化问题,但数据库接口的抽象可能会克服这些缺点。
您提到 ORM 有时会使用许多 sql 语句,而它只能使用一个。如果您的 ORM 支持,您可能想查看“急切加载”。这告诉 ORM 在从另一个模型中获取数据的同时从相关模型中获取数据。这应该会产生更高性能的 sql。
我建议您坚持使用您的 ORM 并优化需要它的部分,但是,在恢复编写 SQL 进行访问之前,请探索 ORM 中允许您提高性能的任何方法。
【讨论】:
我基本同意你的看法。实际上,我可以找出哪些 ORM 操作会减慢数据库查询并在破解 ORM 内部后优化它们。这意味着我应该一方面非常了解sql,另一方面非常了解ORM内部。与专注于原始 sql 相比,这似乎不值得。【参考方案2】:如果您发现某些查询是瓶颈,一个好的 ORM 允许您调整数据访问。
但您可能需要这样做的事实丝毫不会消除 ORM 方法的价值,因为它可以迅速让您发现瓶颈所在。很少有每行代码都需要进行相同数量的仔细手动优化的情况。大部分不会。只有少数热点需要注意。
如果您手动编写所有 SQL,那么您就是在对整个产品进行“微优化”,包括不需要它的部分。所以你大多是在浪费精力。
【讨论】:
如果您让开发人员 DBA 管理数据,而多个不同的客户团队访问数据库会怎样? @gbn - 不知道你要问这个问题,但在这种情况下,我会推出一个单一的数据层(使用 ORM 开发)给所有其他团队共享,并且然后根据他们的反馈(无论是性能、可用性或任何其他质量标准)对其进行改进。 我的方向是:我所有的客户团队都针对我的存储过程编写代码。这让我可以处理 Java、c#、vb.net 和 VBA 客户端。 DAL 是存储过程。客户端语言和 ORM 无关紧要。 即用特定于 RDBMS 的语言对 ORM 输出的等效项进行手动编码。我工作的另一个小组尝试过。最初的要求是特定的 RDBMS,但很快就改变了(他们自己成功的受害者)。此外,假设 SP 会“更快”,但事实证明,应用程序的某些部分需要动态生成 SQL,因为用户需要非常灵活的查询。你猜怎么着,那些动态查询竟然是系统中最常用的查询。为几乎从未运行过的查询维护多组 SP 的所有努力!下一个版本使用 ORM。 因此,如果您永远不需要切换 RDBMS 供应商的能力(不知道为什么要排除这种情况),您应该没问题...这篇博文总结了我的态度:@ 987654321@【参考方案3】:这是来自Wikipedia的定义
对象-关系映射是一种编程技术,用于在关系数据库中不兼容的类型系统和面向对象的编程语言之间转换数据。这实际上创建了一个可以在编程语言中使用的“虚拟对象数据库”。
【讨论】:
【参考方案4】:一个好的 ORM(如 Django 的)可以让您的应用程序开发和发展更快;它让您假设您拥有所有相关数据,而无需考虑手动调整查询中的每次使用。
但一个简单的(如 Django 的)并不能让您摆脱良好的旧数据库设计。如果您看到少于数百个同时用户的数据库瓶颈,那么您遇到了严重的问题。要么你的数据库没有很好地调整(通常你缺少一些索引),要么它不能恰当地代表数据设计(如果你需要为每个页面进行许多不同的查询,这就是你的问题)。
所以,除非你是 twitter 或 flickr,否则我不会放弃 ORM。首先做所有通常的数据库分析:你看到很多全表扫描?添加适当的索引。每页有很多查询?重新考虑你的桌子。每个用户都需要大量统计数据?在批处理作业中预先计算它们并从那里提供服务。
【讨论】:
谢谢。但是在你调整数据库之后,你可能会遇到同样的问题。可能db不能再调优了,需要考虑将ORM操作重写为raw sql以获得更好的性能。 当然。我只是碰巧相信 ORM 的性能上限真的很高。大多数网站都不会在附近。此外,它不仅仅是“调整数据库”;它还与使用正确的数据结构和算法有关。如果您每页执行 50 次查询,那么再多的数据库调整也无济于事,您必须将其减少到 10 以下,理想情况下少于 5 次。【参考方案5】:ORM 让您不必编写讨厌的 SQL。
当您(从不)将您的软件移植到另一个数据库引擎时,它也很有帮助。
不利的一面:您会失去性能,您可以通过编写自定义风格的 SQL 来解决这个问题 - 它试图从一开始就不必编写。
【讨论】:
【参考方案6】:ORM 为您生成 sql 查询,然后作为对象返回给您。这就是为什么它比直接访问数据库要慢的原因。但我认为它有点慢......我建议你调整你的数据库。可能你需要检查表的索引等。
例如,如果您需要提高速度,则需要对 Oracle 进行调整(我不知道为什么,但我的数据库管理员这样做了,它在处理涉及大量数据的查询时工作得更快)。
我有建议,如果您需要执行除(创建更新删除/CRUD)之外的复杂查询(例如:报告),并且如果您的应用程序不会使用另一个数据库,您应该使用直接 sql(我认为 Django 有功能)
【讨论】:
谢谢。你的结论和我的差不多。以上是关于ORM是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章