<!-- Author: Tower Joo<zhutao.iscas@gmail.com> --><!-- Time: 2009-07-05 23:39 -->
本文主要介绍我对于 ORM 的一些理解, 关于ORM的讨论可以参见 TL 和 SO.
内容如下:
ORM (Object Relational Mapping, 对象关系映射)是一种在不同的数据库之上封装并提供一个统一的操作接口的 技术. ORM能够为用户提供统一的OO接口, 是 DAL (Data Access Layer, 数据访问接口)的一种实现方式.
ORM为程序员提供了一个完整的访问数据库的接口, 并且是以程序员熟悉的 OO 方式来提供, 因而对于程序员而言, 能够很大的提高效率.封装于底层sql操作之上的ORM能够提供更加健状(更少的代码,意味着更少的错误)的数据访问机制,能够 在一定程度上提供安全的保证(防止sql注入等).
ORM通常用于:
- 熟悉OO但不熟悉sql的程序员
- 对sql性能要求不是太迫近
- 有数据库迁移的需求
- 知道ORM的底层的实现(事实上大多数程序是不知道的,并且自以为ORM已经做到最优,很可惜事实并非如此)
ORM的提出及实现在工业上是具有极大意义的,它使得DBA和程序员的工作可以分开, 它使得程序员不必更多地关注数据库的细节, 而专注于事务逻辑的实现.
但, 任何层面的封装, 也就意味着程序员离实际目标(DB)更远, 性能也必将有所损失, 逻辑上也显得更加复杂.
而,对于数据库一个很重要应用领域的互联网应用, 绝大部分都是有大PV预期的, 因而当用户达到一定程序时, DB的访问必将成为性能瓶颈.因而这里就得 反思ORM的意义.
ORM的好处也是显然的, 上面也已经提到了部分, 大致的好处如下:
-
提高开发效率,提高代码健状程度
- 在互联网应用领域,快速出产品,继而迭代开发是十分重要的,谁先抢占市场,谁就更有机会成功.因而开发效率是至关重要的.
- 使用ORM可以减少代码量, 而更少的代码意味着更健状, 因而也能够提高代码的健状性
- 避免了提前优化的问题
-
为程序员提供一个完整的,统一的OO访问的接口, 使得程序员更加专注于事务逻辑而非DB的细节
- 无论DB backend是什么, 都能够提供一个统一的OO接口
- 让程序员能够使用相同的逻辑(毕竟sql和OO是不同的逻辑, 都使用OO也就避免了这种转换的成本,减少了出错的机率)
-
让程序员可以站在 一定的高度 (通常是可以看到影响应用性能的全局的问题),而进行全局的优化,而不至于陷入到 微优化 的trap中
- 站的高度越高,通常意味着能够以更加宽视野的角度来处理问题中的瓶颈,而避免了只对细微不起主导作用的局部的优化(牵扯到优化的成本)
-
随着ORM框架的演进, 会提供愈加完善,高性能的支持
- 有专业的ORM框架开发团队, 意味着有持续完善的,性能不断提高的ORM可用, 从而也逐步减少了下文提到的ORM的不足
- 风险分担通常也是一种好的策略
-
简单,高效的数据库迁移
- 当你有数据库迁移需求时, ORM的作用则显得无比的重要, 无需任何代码更改即可(与实际的ORM实现有关)
-
关于 eager loading (即一条操作将所有相关的数据一起取出来)
- 这点技术还是太熟悉, 但是可以肯定的是 eager loading 能够在一定程度上提高效率,但是同样具有 黑盒 的味道
-
性能的损失
- ORM最终还是将一些OO操作映射到具体的sql语句,继而由DB执行, 因而sql语句的效率取决于ORM本身映射的实现,显然sql的透明性和灵活性已经失去
-
程序员依赖于ORM,而失去了 关键资源的控制权
- 在性能要求很高时, DB的控制权则是关键资源, 而由ORM来 黑盒 (对于大多数程序员而言) 地转发sql显然是一种高风险的行为
-
学习成本
- 如果程序员又要使用ORM又不想牺牲效率, 这时一种选择即是探究ORM的底层实现,知道哪些操作是 expensive 的,但是显然相比于只对sql的掌握,阅读ORM的源码的成本会更高,况且在知道了其内部原理后仍需熟悉sql
我的结论是, 满足下面特征的应用推荐使用ORM(并非与的关系):
- 开发时间要求紧迫
- 有数据库迁移需求
- 了解ORM的内部实现
而满足下面特征的应用则推荐使用raw sql来开发:
- 效率要求高
- 无数据库迁移需求
在和大家讨论过程中有朋友提到可以使用 存储过程 来提高DB效率, 初步了解后觉得也不失为一种好方法, 等自己对这个知识有一定理解后,在后续的博客中会探讨.
分享到:
相关推荐
标题“hibernate官方入门教程 (转载)”表明这是一份关于Hibernate框架的基础教学资源,可能是从官方文档或者其他可靠来源整理而来的,适合初学者了解和学习Hibernate。 描述中提到的“NULL”意味着没有具体的描述...
4. **数据持久化**:ThinkAndroid提供了对SQLite数据库和ORM(Object-Relational Mapping)的支持,使得数据存储和检索更加便捷。ORM工具如Room可以简化数据库操作,减少手动编写SQL语句的工作量。 5. **网络通信**:...
在实际项目中,我们可能会使用如ERWin、PowerDesigner等工具来辅助绘制ER图,使用DDL语句在数据库中创建表结构,或者使用ORM框架(如Hibernate、MyBatis)将数据模型映射到代码中。 结合文件名,我们可以推断出以下...
在这个"淘宝客C#开源码(转载下载)"项目中,我们关注的是一个使用C#编程语言开发的微信小程序源代码。C#是一种面向对象的、现代的编程语言,广泛应用于Windows平台的应用程序开发,尤其是微软的.NET框架。 这个...
Spring是Java开发中最流行的框架之一,它以依赖注入(Dependency Injection,DI)和面向切面编程(Aspect-Oriented Programming,AOP)为核心,极大地简化了企业级应用的开发。 首先,我们需要理解什么是依赖注入。...
**标题:“Hibernate缓存机制,转载”** **描述:**这篇博客主要探讨了Hibernate框架中的缓存机制,包括一级缓存和二级缓存的概念、工作原理以及如何在实际开发中应用。 **标签:“源码 工具”** **知识点详解:*...
- **学习曲线**:相比JDBC,Hibernate的学习成本较高,需要理解ORM的概念和配置。 - **灵活性受限**:对于复杂的SQL查询和数据库特定功能,直接使用JDBC可能更为灵活。 3. **JDBC的优点**: - **性能**:JDBC...
【标题】"jsr168portlet"是关于在Java Web开发中实现JSR168规范的一个项目,它结合了Struts2、Spring2.5和Hibernate3.3这三大...对于学习和理解Java Web开发,尤其是portlet开发的读者来说,这是一个很好的实践案例。
作者EricZhang强调,此系列文章将避免过多的理论探讨,而是通过实例让读者更直观地理解分层架构。 首先,文章的【综述】部分介绍了分层架构的概念和目的,指出它有助于提高代码的可维护性和可扩展性。作者计划通过...
作为个人毕业设计作品,它展示了开发者在Web开发领域的技术掌握程度,尤其是对SpringBoot的理解和应用。下面将详细阐述该项目的核心知识点。 1. **SpringBoot框架**:SpringBoot是由Pivotal团队提供的全新框架,它...
4. **数据库和 Active Record**:Rails 使用 Active Record 实现 ORM(对象关系映射),通过简单的 Ruby 代码就能操作数据库。理解 Active Record 的查询接口、关联关系(一对一、一对多、多对多)以及事务处理是...
2. **Entity Framework**:可能用于数据库操作,这是一个ORM(对象关系映射)工具,使得开发者可以使用C#对象来操作数据库,简化了数据访问层的代码编写。 3. **LINQ(Language Integrated Query)**:C#中的查询...
这本启蒙教材正是为初学者提供了深入理解Rails的入口,帮助他们快速上手这一强大的Web开发工具。 Rails遵循MVC(模型-视图-控制器)架构模式,它将业务逻辑、数据和用户界面分离,使得开发者可以更专注于各自领域的...
M代表模型,主要负责处理数据和数据库交互,通常利用ORM(对象关系映射)技术来实现数据与对象的转换。V代表视图,主要负责数据的展示和前台界面编写。C代表控制器,主要负责控制逻辑处理,它连接模型和视图,处理...
对于【JAVA面试常被问到的题目[转载+解答] - Moon Face - 博客园.png】这个文件,通常它可能包含了一篇博客文章的截图,其中详细解答了一些Java面试题。如果能够查看这个文件,你将得到更具体的答案和解析,帮助你在...
这篇文章可能探讨了在Java中如何设计和实现数据持久化层,特别是如何将数据库中的记录映射到Java对象(ORM,对象关系映射)。可能涉及JPA(Java Persistence API)或Hibernate等框架,讲解如何创建实体类,配置映射...