mysql - 是否值得使用 ORM
问题描述
我正在使用项目的查询生成器 knex,但是在使用联接时遇到了问题,您必须手动匹配相关数据或执行单独的查询并绑定相关数据,所以我正在考虑使用 ORM 但在某个地方我听说它们速度较慢,并且在后台使用循环进行查询,我使用 nodejs 所以它可以阻塞线程,所以值得你自己使用 ORM 或更好的 mate join 数据吗?
解决方案
您应该尝试使用 ORM 和使用纯 SQL 不使用 ORM。您将看到 99% [1] 的时间里,使用 ORM 会更好。很少有项目如此简单以至于使用 ORM 没有好处。
您听到的人是错误的,或者他们使用了错误的 ORM,或者他们没有正确使用他们选择的 ORM。良好的 ORM 对其数据方法的实现进行了很好的调整,使用图形算法来找出用于获取请求数据的最佳查询数量,以及它们与尽可能少的查询的关系。它不会阻塞事件循环,除非你自己在查询生命周期钩子中做了一些缓慢的阻塞代码。
我多次遇到这种对 ORM 的误解,即它们会限制您进行高效查询的能力,但并非所有 ORM 都如此。
Node.js 很少有轻量级的 ORM,可以很容易地完成常见的 ORMy 任务,但它们不会强迫您将 SQL 抽象出来。当您一直需要时,您仍然可以拥有 SQL 甚至原始查询的全部功能,但是您将比使用普通 SQL 更容易地使用关系。
例如,您可以有效地读取/写入嵌套的 JSON 结构并使用单行轻松填充多个表并从数据库中读取嵌套数据,而无需找出优化所需查询数量以获取相关数据并构造嵌套数据的图形算法从平面查询结果。
最后,如果您不使用任何 ORM 和一组自定义助手,其他人将更难进入该代码库,因为它将充满自定义普通 SQL + 各种助手。
免责声明:我有偏见(并且知道我在说什么),因为过去几年我一直在维护 knex 查询构建器,并且我参与了我可以推荐的唯一轻量级 Node.js ORM 的开发:反对.js
[1] 斯泰森-哈里森 1987
推荐阅读
- java - Firebase 安全规则需要获取孩子的多个查询
- java - 使用 BlockingQueue 的 java 异步服务实现
- javascript - 使用 jquery 和 jquery.copy-to-clipboard.js 复制到剪贴板问题
- node.js - MongoDb 根据是否指定字段进行查询
- ruby-on-rails - 我想运行一个旧的 rails 3.3.2 项目,为此寻找特定和具体的步骤
- reactjs - react-hook-form 控制器,基于值进行验证
- python - 为什么它在 python 的 codeforces 上给出运行时错误?
- r - 根据多个条件过滤行
- git - 我怎样才能发现我隐藏的 git commit 哈希?
- javascript - 抓取稍后使用 Cheerio 加载的数据