【发布时间】:2009-05-12 21:23:27
【问题描述】:
如果我使用存储过程,我可以使用 ORM 吗?
编辑:
如果我可以使用 ORM,这是否会破坏使用 ORM 的数据库不可知性的部分原因?换句话说,如果我将自己绑定到具有存储过程的特定数据库(或者这种假设是否错误),我为什么还要使用 ORM?
【问题讨论】:
标签: stored-procedures orm
如果我使用存储过程,我可以使用 ORM 吗?
编辑:
如果我可以使用 ORM,这是否会破坏使用 ORM 的数据库不可知性的部分原因?换句话说,如果我将自己绑定到具有存储过程的特定数据库(或者这种假设是否错误),我为什么还要使用 ORM?
【问题讨论】:
标签: stored-procedures orm
使用 ORM 访问存储过程是 ORM 的最佳用途之一。它将为您提供强类型对象,同时您仍然可以完全控制 SQL。
【讨论】:
根据我的经验,我会让 ORM 处理“CRUD”操作,而将专业工作留给存储过程。通常,将存储过程用于“CRUD”操作是多余的,让 ORM 处理它可以大大提高您的工作效率。
【讨论】:
是的,你可以,所有主要的 ORM 都支持存储过程。
至于您的假设,您是特别正确的,当您将存储过程与 ORM 一起使用时,您将项目耦合到特定数据库。但实际上 99% 的情况是您不需要更改数据库提供程序,因此在这种情况下,您使用 ORM 不是为了从具体的数据库提供程序中抽象出来,而是帮助自己完成对象关系映射任务——这是 ORM 的主要任务以及最初是为哪个 ORM 制作的。
【讨论】:
它提出了一个有趣的观点。
一旦有了 ORM 和相对简单的查询,为什么还需要存储过程? SP 与数据库密切相关。 ORM 使您不必维护大量特定于 DB 的代码。什么是 DB-specific 可以被隔离和管理。
我建议 ORM 是降低复杂性并将所有处理放在它所属的代码中的绝佳机会。
将数据库用于它最擅长的事情——存储数据。
将您的应用程序用于其最擅长的事情——处理数据。
【讨论】:
您可以同时使用 ORM 功能和存储过程功能。特别是使用 ORM 直到它适合您,但如果您在性能方面遇到问题或需要一些低级调整 - 在您的业务逻辑中包含存储过程。
【讨论】:
是的,您可以,但您需要花一些时间研究 ORM 围绕存储过程提供了哪些功能。
大多数将允许您运行返回强类型对象/实体的存储过程。更高级的 ORM 将允许您插入存储过程以执行 CRUD 操作(因此您的通用查询、删除等通过存储过程而不是动态查询进行)。
通常,ORM 非常适合生成临时查询和获取强类型实体,但具有强大的存储过程支持的好处是允许您(有时)更轻松地访问您的 RDMS 的本机功能,这些本机功能可能不会作为第一类公开ORM 中的公民 - 特别是如果 ORM 支持许多数据库引擎。
跟进您的编辑:
通常您会想要使用 ORM 提供的即席查询引擎,但是正如我之前提到的 - 有时您想要使用 ORM 未公开的功能进行查询。
强类型实体的好处是无价的,因为这意味着您通常拥有域对象,而不是数据读取器、数据表等。您可以在检索到的实体中清晰地封装行为和逻辑。
其他好处的列表确实很长 - 例如,使用 LightSpeed ORM(和大多数其他),您的实体将支持标准绑定接口、错误报告接口、验证等。在查询方面,您将失去惰性加载等,除非你自己写。
【讨论】:
数据库“不可知性”(?) 并不是使用 ORM 的唯一原因。但是,您可以利用与数据库交互的 99% 独立于数据库,并且在 1%(或 2% 或 10% 或其他)中,您可能需要存储过程来提高速度/清晰度/复杂性。如果您更改了 DB,则需要重写它们。
【讨论】:
我在工作中经常使用 netTiers,我们让它为我们生成存储过程。这些只处理基本的 CRUD 操作,但它们非常快并且为我节省了大量时间。 netTiers 还将让我们创建自定义存储过程并使用这些过程生成我们的数据访问代码。
【讨论】:
可以,但许多更高级的 ORM 功能往往会变得更麻烦。 iBatis 之类的东西很容易与存储过程集成,而更复杂的引擎(如 (N?)Hibernate 之类的动态 SQL 生成和大字段的延迟加载)的更复杂的功能可能会变得比它们更麻烦值得。
【讨论】:
我相信任何能让你从重复工作中解放出来并专注于解决问题的工具都是有效的。当涉及到基本的 CRUD 操作时,ORM 似乎就是那种工具——即使使用 SP 来更好地实现需求(比如在钉子上使用锤子,它只是完成任务的正确工具)。
重点是:没有黑色或白色,只有灰色的刻度。非常无能和编码错误的应用程序以“与数据库无关”为借口来解释数据库资源的过度使用。在许多情况下,与数据库紧密联系也不好。目标是:在不浪费客户 IT 资源的情况下获得最大程度的“数据库不可知论”。
没有“旧与新”之分,只是人们说极端“纯粹”的方法更好。我真的不相信。我相信,与任何工具一样,“最佳”(注意引号)方法是使用 ORM,直到仍然是使您的数据访问的正确工具。当您达到浪费资源并降低可伸缩性和 TI 资源的“价值生活”(我忘记了葡萄牙语“vida útil”的英文表达)的程度时,请在 ORM 中使用 SP。或者,换句话说,当它用于手头的处理时,使用 SP 就像锤子用于钉子一样。
【讨论】: