`
无为1055
  • 浏览: 2225 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

ORM之我的理解(转载)

阅读更多

 

 

ORM之我的理解

<!-- Author: Tower Joo<zhutao.iscas&#64;gmail.com> --><!-- Time: 2009-07-05 23:39 -->

摘要

本文主要介绍我对于 ORM 的一些理解, 关于ORM的讨论可以参见 TLSO.

内容如下:

ORM的定义

ORM (Object Relational Mapping, 对象关系映射)是一种在不同的数据库之上封装并提供一个统一的操作接口的 技术. ORM能够为用户提供统一的OO接口, 是 DAL (Data Access Layer, 数据访问接口)的一种实现方式.

ORM的应用场景

ORM为程序员提供了一个完整的访问数据库的接口, 并且是以程序员熟悉的 OO 方式来提供, 因而对于程序员而言, 能够很大的提高效率.封装于底层sql操作之上的ORM能够提供更加健状(更少的代码,意味着更少的错误)的数据访问机制,能够 在一定程度上提供安全的保证(防止sql注入等).

ORM通常用于:

  • 熟悉OO但不熟悉sql的程序员
  • 对sql性能要求不是太迫近
  • 有数据库迁移的需求
  • 知道ORM的底层的实现(事实上大多数程序是不知道的,并且自以为ORM已经做到最优,很可惜事实并非如此)

ORM的评价

ORM的提出及实现在工业上是具有极大意义的,它使得DBA和程序员的工作可以分开, 它使得程序员不必更多地关注数据库的细节, 而专注于事务逻辑的实现.

但, 任何层面的封装, 也就意味着程序员离实际目标(DB)更远, 性能也必将有所损失, 逻辑上也显得更加复杂.

而,对于数据库一个很重要应用领域的互联网应用, 绝大部分都是有大PV预期的, 因而当用户达到一定程序时, DB的访问必将成为性能瓶颈.因而这里就得 反思ORM的意义.

ORM的好处

ORM的好处也是显然的, 上面也已经提到了部分, 大致的好处如下:

  1. 提高开发效率,提高代码健状程度

    • 在互联网应用领域,快速出产品,继而迭代开发是十分重要的,谁先抢占市场,谁就更有机会成功.因而开发效率是至关重要的.
    • 使用ORM可以减少代码量, 而更少的代码意味着更健状, 因而也能够提高代码的健状性
    • 避免了提前优化的问题
  2. 为程序员提供一个完整的,统一的OO访问的接口, 使得程序员更加专注于事务逻辑而非DB的细节

    • 无论DB backend是什么, 都能够提供一个统一的OO接口
    • 让程序员能够使用相同的逻辑(毕竟sql和OO是不同的逻辑, 都使用OO也就避免了这种转换的成本,减少了出错的机率)
  3. 让程序员可以站在 一定的高度 (通常是可以看到影响应用性能的全局的问题),而进行全局的优化,而不至于陷入到 微优化 的trap中

    • 站的高度越高,通常意味着能够以更加宽视野的角度来处理问题中的瓶颈,而避免了只对细微不起主导作用的局部的优化(牵扯到优化的成本)
  4. 随着ORM框架的演进, 会提供愈加完善,高性能的支持

    • 有专业的ORM框架开发团队, 意味着有持续完善的,性能不断提高的ORM可用, 从而也逐步减少了下文提到的ORM的不足
    • 风险分担通常也是一种好的策略
  5. 简单,高效的数据库迁移

    • 当你有数据库迁移需求时, ORM的作用则显得无比的重要, 无需任何代码更改即可(与实际的ORM实现有关)
  6. 关于 eager loading (即一条操作将所有相关的数据一起取出来)

    • 这点技术还是太熟悉, 但是可以肯定的是 eager loading 能够在一定程度上提高效率,但是同样具有 黑盒 的味道

ORM的不足

  1. 性能的损失

    • ORM最终还是将一些OO操作映射到具体的sql语句,继而由DB执行, 因而sql语句的效率取决于ORM本身映射的实现,显然sql的透明性和灵活性已经失去
  2. 程序员依赖于ORM,而失去了 关键资源的控制权

    • 在性能要求很高时, DB的控制权则是关键资源, 而由ORM来 黑盒 (对于大多数程序员而言) 地转发sql显然是一种高风险的行为
  3. 学习成本

    • 如果程序员又要使用ORM又不想牺牲效率, 这时一种选择即是探究ORM的底层实现,知道哪些操作是 expensive 的,但是显然相比于只对sql的掌握,阅读ORM的源码的成本会更高,况且在知道了其内部原理后仍需熟悉sql

结论

我的结论是, 满足下面特征的应用推荐使用ORM(并非与的关系):

  1. 开发时间要求紧迫
  2. 有数据库迁移需求
  3. 了解ORM的内部实现

而满足下面特征的应用则推荐使用raw sql来开发:

  1. 效率要求高
  2. 无数据库迁移需求

后记

在和大家讨论过程中有朋友提到可以使用 存储过程 来提高DB效率, 初步了解后觉得也不失为一种好方法, 等自己对这个知识有一定理解后,在后续的博客中会探讨.

分享到:
评论

相关推荐

    hibernate官方入门教程 (转载)

    标题“hibernate官方入门教程 (转载)”表明这是一份关于Hibernate框架的基础教学资源,可能是从官方文档或者其他可靠来源整理而来的,适合初学者了解和学习Hibernate。 描述中提到的“NULL”意味着没有具体的描述...

    <转载>ThinkAndroid

    4. **数据持久化**:ThinkAndroid提供了对SQLite数据库和ORM(Object-Relational Mapping)的支持,使得数据存储和检索更加便捷。ORM工具如Room可以简化数据库操作,减少手动编写SQL语句的工作量。 5. **网络通信**:...

    数据模型设计心得(转载)

    在实际项目中,我们可能会使用如ERWin、PowerDesigner等工具来辅助绘制ER图,使用DDL语句在数据库中创建表结构,或者使用ORM框架(如Hibernate、MyBatis)将数据模型映射到代码中。 结合文件名,我们可以推断出以下...

    淘宝客C#开源码(转载下载)

    在这个"淘宝客C#开源码(转载下载)"项目中,我们关注的是一个使用C#编程语言开发的微信小程序源代码。C#是一种面向对象的、现代的编程语言,广泛应用于Windows平台的应用程序开发,尤其是微软的.NET框架。 这个...

    (转载)自己动手写一个spring

    Spring是Java开发中最流行的框架之一,它以依赖注入(Dependency Injection,DI)和面向切面编程(Aspect-Oriented Programming,AOP)为核心,极大地简化了企业级应用的开发。 首先,我们需要理解什么是依赖注入。...

    Hibernate缓存机制,转载

    **标题:“Hibernate缓存机制,转载”** **描述:**这篇博客主要探讨了Hibernate框架中的缓存机制,包括一级缓存和二级缓存的概念、工作原理以及如何在实际开发中应用。 **标签:“源码 工具”** **知识点详解:*...

    jdbc与hibernate的优缺点比较(转载的精髓).pdf

    - **学习曲线**:相比JDBC,Hibernate的学习成本较高,需要理解ORM的概念和配置。 - **灵活性受限**:对于复杂的SQL查询和数据库特定功能,直接使用JDBC可能更为灵活。 3. **JDBC的优点**: - **性能**:JDBC...

    jsr168 portlet(struts2+spring2.5+hibernate3.3)(转载)

    【标题】"jsr168portlet"是关于在Java Web开发中实现JSR168规范的一个项目,它结合了Struts2、Spring2.5和Hibernate3.3这三大...对于学习和理解Java Web开发,尤其是portlet开发的读者来说,这是一个很好的实践案例。

    【转载】NET平台下的架构开发(最全的).docx

    作者EricZhang强调,此系列文章将避免过多的理论探讨,而是通过实例让读者更直观地理解分层架构。 首先,文章的【综述】部分介绍了分层架构的概念和目的,指出它有助于提高代码的可维护性和可扩展性。作者计划通过...

    本项目是基于SpringBoot的线上宠物物资购买系统,为个人毕业设计,未经允许禁止转载.zip

    作为个人毕业设计作品,它展示了开发者在Web开发领域的技术掌握程度,尤其是对SpringBoot的理解和应用。下面将详细阐述该项目的核心知识点。 1. **SpringBoot框架**:SpringBoot是由Pivotal团队提供的全新框架,它...

    转载 - 26本 Ruby/Rails 相关英文图书简评

    4. **数据库和 Active Record**:Rails 使用 Active Record 实现 ORM(对象关系映射),通过简单的 Ruby 代码就能操作数据库。理解 Active Record 的查询接口、关联关系(一对一、一对多、多对多)以及事务处理是...

    悠索科技高校教务管理系统(转载)

    2. **Entity Framework**:可能用于数据库操作,这是一个ORM(对象关系映射)工具,使得开发者可以使用C#对象来操作数据库,简化了数据访问层的代码编写。 3. **LINQ(Language Integrated Query)**:C#中的查询...

    ruby on rails, 非常棒的启蒙教材(转载)

    这本启蒙教材正是为初学者提供了深入理解Rails的入口,帮助他们快速上手这一强大的Web开发工具。 Rails遵循MVC(模型-视图-控制器)架构模式,它将业务逻辑、数据和用户界面分离,使得开发者可以更专注于各自领域的...

    2014年辛星ThinkPHP教程夏季版

    M代表模型,主要负责处理数据和数据库交互,通常利用ORM(对象关系映射)技术来实现数据与对象的转换。V代表视图,主要负责数据的展示和前台界面编写。C代表控制器,主要负责控制逻辑处理,它连接模型和视图,处理...

    Java面试题

    对于【JAVA面试常被问到的题目[转载+解答] - Moon Face - 博客园.png】这个文件,通常它可能包含了一篇博客文章的截图,其中详细解答了一些Java面试题。如果能够查看这个文件,你将得到更具体的答案和解析,帮助你在...

    JAVA文章精选542个(txt) 免费分享

    这篇文章可能探讨了在Java中如何设计和实现数据持久化层,特别是如何将数据库中的记录映射到Java对象(ORM,对象关系映射)。可能涉及JPA(Java Persistence API)或Hibernate等框架,讲解如何创建实体类,配置映射...

Global site tag (gtag.js) - Google Analytics