自制SQL模型与ORM?

时间:2011-10-06 11:23:45

标签: web-applications orm refactoring lamp

我已经阅读了有关ORM优缺点的Stack Overflow讨论,并且有不同的意见。我想描述这个特例。

  • 基于LAMP的中型网络应用程序,里面有一些意大利面条代码。
  • 代码远不是OOP,虽然有控制器有嵌入式模板,弱模型类分支。
  • 有几十个MySQL表,大约有一千个文件。
  • 缓存,针对具有指标的性能MySQL查询进行调整。
  • 每月约有一百万次观看。
  • 用户主要是读取权限。

我的问题是:

实现ORM(Doctrine2或Propel)是否值得,或者我应该限制自己从头开始编写模型类(类似于ActiveRecord模式,按表和记录分组方法/查询,所以每个实体都有两个相关的类?)

主要目标是:

  1. 应用程序性能,

  2. 易于编码/查询可读性和修改,以及

  3. 易于对DB(细节)进行修改。

  4. 我个人更喜欢第二种选择;有很复杂的SQL查询,我怀疑ORM能否为所有查询维护数据库抽象。最初的开发已经结束,并且不需要快速开发代码/查询代码。能够轻松阅读,理解和修改代码/查询对我们来说更为重要。

    另一方面,在我错过的特定条件下,ORM可能会有一些优势。

1 个答案:

答案 0 :(得分:1)

构建代码肯定会帮助你2和3,如果做得对,1也不应该受到影响。当您合并第三方ORM时,良好的性能应该更容易实现,因为这些ORM支持的功能,如缓存和延迟加载“开箱即用”。

我建议您尝试在一小步骤内重构您的应用程序,同时添加新功能或解决错误,从而避免难以证明和管理的大型重构项目。

我认为使用第三方ORM的一个好方法是以类似的方式组织现有的代码和查询。因此,您可能会引入ProductRepository类,该类具有封装现有查询的方法find()并返回ResultSet。接下来,您应该介绍Product Data Class(仅包含字段且没有方法的类)。产品类应映射DB中的Product表。现在找到应返回的产品数组。 find()方法现在首先将ResultSet转换为Products数组并返回数组。应相应地修改客户端代码。最后,您开始使用委托给ORM替换find()方法中的自定义查询。使用Repository的客户端不应检测到更改。 Product数据类是模型层的种子。随着您的继续,您可以添加行为并创建一个真正的域图层。

回到你的问题,我会说你首先以自定义Active Record的形式对现有代码进行分组(我建议Repository,但最后只是组织问题),然后你引入ORM。所以,这不是 - 或者情况,而是重构的第一和第二阶段。

我会通过以下方式解决这个问题:

  1. 首先编写一些自动化测试
  2. 尝试分离不同层中的代码:表示,域,持久性。
  3. 按照上一节中的说明执行重构。
  4. 实现完全成熟,可重复使用的ORM是很多工作,因此我建议您合并现有的ORM并开始小步骤。

    我在C#专业重构书中详细描述了这种方法,您可以下载示例代码,引导您完成here