博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
浅谈model, orm, dao和active record的区别
阅读量:5833 次
发布时间:2019-06-18

本文共 1370 字,大约阅读时间需要 4 分钟。

在做web开发中,经常会碰到这样几个概念:

  • Model
  • DAO,data access object,数据访问对象
  • ORM,object-relational mapping,对象关系映射
  • Active Record

这些概念都是和数据相关的,然而他们之间有怎样的区别呢?

首先来看Model,模型。模型是MVC中的概念,指的是数据和改变数据的操作(业务逻辑)。模型通常指代现实生活中的某样实体。以订单为例,每个订单都包含许多数据,如客户、价格、明细等等,这些数据都叫做订单这个模型的属性,此外,和订单相关的一些列操作,比如当购买时,你可能需要先检查库存,给与一定的优惠,再更新账户余额和积分等等,这些就叫做业务逻辑,也是模型的一部分,从代码上来讲,是要放在模型中的。

当模型执行完业务逻辑后,我们便要把模型中的数据保存到数据库中。如果我们直接把和数据库相关的代码放在模型里,会使得以后的维护相当的麻烦。在我之前的一个项目中,我们用户的增长相当快,导致一台数据库无法支撑所有的访问,不得不使用分库来解决问题。然而前人把SQL语句直接写在了模型这一层里,这导致分库相当的麻烦,我们只能先把这些SQL语句抽出来,才能把分库进行下去。我们把这些抽出来的SQL代码放到单独的一层,这一层便是DAL,Data Access Layer,数据访问层,它由许多DAO组成,目的便是把和数据库相关的代码封装起来,这样当我们执行分库时,便只用调整DAO的代码了,模型根本不用关心它使用的数据是放在A库还是B库。

DAO其实是来源于J2EE的一个设计模式,当初的目的也是使得企业更换数据库时,不用影响模型层的代码。

与DAO类似,ORM也是一种封装数据访问的概念。然而ORM不像DAO只是一种软件设计的指导原则,强调的是系统应该层次分明。ORM更像是一种工具,有着成熟的产品,比如JAVA界非常有名的Hibernate,以及很多PHP框架里自带的ORM库。他们的好处在于能将你程序中的数据对象自动地转化为关系型数据库中对应的表和列,数据对象间的引用也可以通过这个工具转化为表之间的join,而Hibernate甚至提供一套他们自己的数据查询语言HQL来解决复杂的查询问题。

使用ORM的好处就是使得你的开发几乎不用接触到SQL语句。创建一张表,声明一个对应的类,然后你就只用和这个类的实例进行交互了,至于这个对象里的数据该怎么存储又该怎么获取,通通不用关心。

Active Record则是随着ruby on rails的流行而火起来的一种ORM模式,它是把负责持久化的代码也集成到数据对象中,即这个数据对象知道怎样把自己存到数据库里。这与以往的ORM有不同,传统的ORM会把数据对象和负责持久化的代码分开,数据对象只是一个单纯包含数据的结构体,在模型层和ORM层中传递。而在Active Record中,模型层集成了ORM的功能,他们既代表实体,包含业务逻辑,又是数据对象,并负责把自己存储到数据库中,当然,存储的这一部分代码是早已在模型的父类中实现好了的,属于框架的一部分,模型只需简单的调用父类的方法来完成持久化而已。

转载于:https://www.cnblogs.com/ghw0501/archive/2012/06/28/4733857.html

你可能感兴趣的文章
弹框时出现灰色背景
查看>>
【模板】【数论】二次剩余Cipolla算法,离散对数BSGS 算法
查看>>
5 个很适合在课堂上演示的树莓派项目
查看>>
source tree图谱
查看>>
什么是P2P流标
查看>>
基于flask的网页聊天室(一)
查看>>
如何使用DSP的cache(转)
查看>>
什么是分布式计算
查看>>
sql注入
查看>>
MybatisMapper 映射框架(增删改查 原始模式)
查看>>
File.Exists or FileInfo.Exists
查看>>
HDU 1520 Anniversary party【树形DP】
查看>>
如何使用VSTS做压力测试
查看>>
装饰器延伸及例题
查看>>
装饰器作用的完善
查看>>
Android 设计随便说说之简单实践(模块划分)
查看>>
Cef3 学习资料
查看>>
第五次会议(4.8)
查看>>
利用符号进行的类型转换,转换成数字类型 ~~
查看>>
[转]单内核与微内核设计之比较
查看>>