Web applications 自制SQL模型与ORM?

Web applications 自制SQL模型与ORM?,web-applications,orm,refactoring,lamp,Web Applications,Orm,Refactoring,Lamp,我读过关于ORM优缺点的堆栈溢出讨论,有不同的观点。我想描述一下这个特殊的案例 基于LAMP的中等规模web应用程序,其中包含一些意大利面代码 代码远非面向对象的,尽管有带有嵌入式模板的控制器和弱模型类 有几十个MySQL表和大约数千个文件 缓存,针对带有标记的MySQL查询的性能进行了优化 每月大约有一百万次浏览量 用户大多具有读访问权限 我的问题是: 实现ORM(Doctrine2或spreep)值得吗,还是我应该限制自己从头开始编写模型类(类似于ActiveRecord模式,按表和记录

我读过关于ORM优缺点的堆栈溢出讨论,有不同的观点。我想描述一下这个特殊的案例

  • 基于LAMP的中等规模web应用程序,其中包含一些意大利面代码
  • 代码远非面向对象的,尽管有带有嵌入式模板的控制器和弱模型类
  • 有几十个MySQL表和大约数千个文件
  • 缓存,针对带有标记的MySQL查询的性能进行了优化
  • 每月大约有一百万次浏览量
  • 用户大多具有读访问权限
我的问题是:

实现ORM(Doctrine2或spreep)值得吗,还是我应该限制自己从头开始编写模型类(类似于ActiveRecord模式,按表和记录对方法/查询进行分组,因此每个实体都有两个相关的类)

主要目标是:

  • 应用程序性能

  • 代码/查询的易读性和修改性,以及

  • 易于修改可能的数据库(详细信息)

  • 我个人更喜欢第二种选择;有相当复杂的SQL查询,我怀疑ORM是否能够为所有查询维护DB抽象。初始开发已经结束,不需要快速开发代码/查询代码。对我们来说,更重要的是能够轻松阅读、理解和修改代码/查询


    另一方面,ORM在特定条件下的使用可能有一些优点,我没有注意到。

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

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

    我认为使用第三方ORM的一个好方法是以类似的方式组织现有代码和查询。因此,您可以引入ProductRepository类,该类具有封装现有查询的find()方法并返回结果集。接下来,您应该介绍产品数据类(只有字段而没有方法的类)。产品类应该映射数据库中的产品表。现在find应该返回产品数组。find()方法现在首先将ResultSet转换为产品数组并返回数组。应相应修改客户端代码。最后,开始将find()方法中的自定义查询替换为ORM委托。使用存储库的客户端不应检测到更改。产品数据类是模型层的种子。接下来,您可以向其添加行为并创建一个真正的域层

    回到您的问题,我建议您首先以自定义活动记录的形式对现有代码进行分组(我建议使用存储库,但最后这只是组织问题),然后引入ORM。所以,这不是非此即彼的情况,而是重构的第一和第二阶段

    我将以以下方式处理这一问题:

  • 首先编写一些自动测试
  • 尝试在不同的层中分离代码:表示、域、持久性
  • 如前一节所述执行重构
  • 实现完全成熟的、可重用的ORM需要大量的工作,所以我建议您合并现有的ORM,并开始以小步骤引入它


    在我的《C#book中的专业重构》一书中,我已经非常详细地描述了这种方法,您可以下载示例代码来指导您完成这一过程。

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

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

    我认为使用第三方ORM的一个好方法是以类似的方式组织现有代码和查询。因此,您可以引入ProductRepository类,该类具有封装现有查询的find()方法并返回结果集。接下来,您应该介绍产品数据类(只有字段而没有方法的类)。产品类应该映射数据库中的产品表。现在find应该返回产品数组。find()方法现在首先将ResultSet转换为产品数组并返回数组。应相应修改客户端代码。最后,开始将find()方法中的自定义查询替换为ORM委托。使用存储库的客户端不应检测到更改。产品数据类是模型层的种子。接下来,您可以向其添加行为并创建一个真正的域层

    回到您的问题,我建议您首先以自定义活动记录的形式对现有代码进行分组(我建议使用存储库,但最后这只是组织问题),然后引入ORM。所以,这不是非此即彼的情况,而是重构的第一和第二阶段

    我将以以下方式处理这一问题:

  • 首先编写一些自动测试
  • 尝试在不同的层中分离代码:表示、域、持久性
  • 如前一节所述执行重构
  • 实现完全成熟的、可重用的ORM需要大量的工作,所以我建议您合并现有的ORM,并开始以小步骤引入它

    我在《C#中的专业重构》一书中详细描述了这种方法,您可以下载将