自制 SQL 模型 vs. ORM?
Posted
技术标签:
【中文标题】自制 SQL 模型 vs. ORM?【英文标题】:Self-made SQL model vs. ORM? 【发布时间】:2011-10-06 11:23:44 【问题描述】:我看过 Stack Overflow 关于 ORM 优缺点的讨论,有不同的看法。我想描述一下这个特殊情况。
基于 LAMP 的中型 Web 应用程序,其中包含一些意大利面条式代码。 代码远非 OOP,尽管有带有嵌入式模板的控制器和弱模型类分支。 有几十个 mysql 表,大约一千个文件。 缓存,已针对带有索引的 MySQL 查询进行了优化。 每月大约有 100 万次观看。 用户大多拥有读取权限。我的问题是这样的:
是否值得实现 ORM(Doctrine2 或 Propel),或者我应该限制自己从头开始编写模型类(类似于 ActiveRecord 模式,按表和记录分组方法/查询,所以每个实体都有两个相关的类)?
主要目标是:
应用程序性能,
代码/查询易于阅读和修改,以及
易于可能的 DB(详细信息)修改。
我个人更喜欢第二种选择;有相当复杂的 SQL 查询,我怀疑 ORM 是否能够为所有查询维护数据库抽象。最初的开发已经结束,不需要快速开发代码/查询代码。对我们来说,能够轻松阅读、理解和修改代码/查询更为重要。
另一方面,在我错过的给定条件下,ORM 的使用可能有一些优势。
【问题讨论】:
【参考方案1】:结构化你的代码肯定会帮助你解决 2 和 3,如果做得好,1 也不应该受到影响。当您合并第三方 ORM 时,应该更容易实现良好的性能,因为这些 ORM 支持“开箱即用”的缓存和延迟加载等功能。
我建议您尝试以小步骤重构您的应用程序,同时添加新功能或解决错误,从而避免难以证明和管理的大型重构项目。
我想说使用第三方 ORM 的一个好方法是以类似的方式组织您现有的代码和查询。因此,您可能会引入 ProductRepository 类,该类具有封装现有查询的方法 find() 并返回一个 ResultSet。接下来,您应该介绍产品数据类(只有字段没有方法的类)。产品类应映射数据库中的产品表。现在 find 应该返回 Products 数组。 find() 方法现在将首先将 ResultSet 转换为 Products 数组并返回该数组。应相应地修改客户端代码。最后,您开始将 find() 方法中的自定义查询替换为对 ORM 的委托。使用 Repository 的客户端不应检测到更改。 Product 数据类是模型层的种子。随着您的继续,您可以为其添加行为并创建一个真正的领域层。
回到您的问题,我会说您首先将现有代码以自定义 Active Record 的形式分组(我建议使用 Repository,但最终它只是组织问题),然后您引入 ORM。所以,这不是非此即彼的情况,而是重构的第一和第二阶段。
我会通过以下方式解决这个问题:
-
先写一些自动化测试
尝试在不同的层中分离代码:表示层、域、持久性。
按照上一节所述执行重构。
实现完全成熟的、可重用的 ORM 需要大量工作,因此我建议您合并现有的 ORM 并开始逐步引入它。
我在我的 Professional Refactoring in C# 一书中非常详细地描述了这种方法,您可以下载示例代码,引导您完成 here。
【讨论】:
以上是关于自制 SQL 模型 vs. ORM?的主要内容,如果未能解决你的问题,请参考以下文章