Web applications 自制SQL模型与ORM?
我读过关于ORM优缺点的堆栈溢出讨论,有不同的观点。我想描述一下这个特殊的案例Web applications 自制SQL模型与ORM?,web-applications,orm,refactoring,lamp,Web Applications,Orm,Refactoring,Lamp,我读过关于ORM优缺点的堆栈溢出讨论,有不同的观点。我想描述一下这个特殊的案例 基于LAMP的中等规模web应用程序,其中包含一些意大利面代码 代码远非面向对象的,尽管有带有嵌入式模板的控制器和弱模型类 有几十个MySQL表和大约数千个文件 缓存,针对带有标记的MySQL查询的性能进行了优化 每月大约有一百万次浏览量 用户大多具有读访问权限 我的问题是: 实现ORM(Doctrine2或spreep)值得吗,还是我应该限制自己从头开始编写模型类(类似于ActiveRecord模式,按表和记录
- 基于LAMP的中等规模web应用程序,其中包含一些意大利面代码
- 代码远非面向对象的,尽管有带有嵌入式模板的控制器和弱模型类
- 有几十个MySQL表和大约数千个文件
- 缓存,针对带有标记的MySQL查询的性能进行了优化
- 每月大约有一百万次浏览量
- 用户大多具有读访问权限
另一方面,ORM在特定条件下的使用可能有一些优点,我没有注意到。构建代码肯定会对2和3有所帮助,如果做得好,1也不会受到影响。当您合并第三方ORM时,良好的性能应该更容易实现,因为这些ORM支持缓存和“开箱即用”的延迟加载等功能 我建议您尝试以小步骤重构应用程序,同时添加新功能或解决bug,从而避免难以证明和管理的大型重构项目 我认为使用第三方ORM的一个好方法是以类似的方式组织现有代码和查询。因此,您可以引入ProductRepository类,该类具有封装现有查询的find()方法并返回结果集。接下来,您应该介绍产品数据类(只有字段而没有方法的类)。产品类应该映射数据库中的产品表。现在find应该返回产品数组。find()方法现在首先将ResultSet转换为产品数组并返回数组。应相应修改客户端代码。最后,开始将find()方法中的自定义查询替换为ORM委托。使用存储库的客户端不应检测到更改。产品数据类是模型层的种子。接下来,您可以向其添加行为并创建一个真正的域层 回到您的问题,我建议您首先以自定义活动记录的形式对现有代码进行分组(我建议使用存储库,但最后这只是组织问题),然后引入ORM。所以,这不是非此即彼的情况,而是重构的第一和第二阶段 我将以以下方式处理这一问题:
在我的《C#book中的专业重构》一书中,我已经非常详细地描述了这种方法,您可以下载示例代码来指导您完成这一过程。构建代码肯定会帮助您处理2和3,如果做得对,1也不会受到影响。当您合并第三方ORM时,良好的性能应该更容易实现,因为这些ORM支持缓存和“开箱即用”的延迟加载等功能 我建议您尝试以小步骤重构应用程序,同时添加新功能或解决bug,从而避免难以证明和管理的大型重构项目 我认为使用第三方ORM的一个好方法是以类似的方式组织现有代码和查询。因此,您可以引入ProductRepository类,该类具有封装现有查询的find()方法并返回结果集。接下来,您应该介绍产品数据类(只有字段而没有方法的类)。产品类应该映射数据库中的产品表。现在find应该返回产品数组。find()方法现在首先将ResultSet转换为产品数组并返回数组。应相应修改客户端代码。最后,开始将find()方法中的自定义查询替换为ORM委托。使用存储库的客户端不应检测到更改。产品数据类是模型层的种子。接下来,您可以向其添加行为并创建一个真正的域层 回到您的问题,我建议您首先以自定义活动记录的形式对现有代码进行分组(我建议使用存储库,但最后这只是组织问题),然后引入ORM。所以,这不是非此即彼的情况,而是重构的第一和第二阶段 我将以以下方式处理这一问题: