Model, Orm, Dao 和 Active Record 的异同点
Model, Orm, Dao 和 Active Record 的异同点,求高手解释,可以基于现在 PHP 的流行框架。能举例更好啦!
回复内容:
Model, Orm, Dao 和 Active Record 的异同点,求高手解释,可以基于现在 PHP 的流行框架。能举例更好啦!
很不巧,这几个词描述不是同一个层次的东西,没什么可比性,更谈不上异同。
在下口拙简述不能,干脆帮你找了点资料,你勉为其难多看下。
Model
恐怕你是在 MVC 里看到这个词的,如字面意思——模型,没什么特别的含义。
具体可参考:http://zh.wikipedia.org/wiki/MVCORM (Object Relational Mapping)
关系型数据库里的数据转化为对象与对象的引用,这样就可以用面向对象的方式访问数据库了,省点脑力,增加开发效率。
具体可参考:http://zh.wikipedia.org/wiki/%E5%AF%B9%E8%B1%A1%E5%85%B3%E7%B3%BB%E6%9...DAO (Data Access Object)
就是在数据源(各种数据库)之上再铺一层代码,抽象出统一的接口,酱紫上层代码就不必为不同的数据源做不同的编码了。
具体可参考:http://en.wikipedia.org/wiki/Data_access_object
没图说个JB,上图:
出自 Java 的技术文档 http://www.oracle.com/technetwork/java/dataaccessobject-138824.htmlActive Record
一种 ORM 的实现方式(多谢@杨益 )。恕在下说不出其中奥妙,毕竟,是个阿猫阿狗都会习惯把数据库里一行记录当作一个可读写的实体,也许“一看就合我意”正是其奥妙本身吧。
马丁老爷的书里倒是阐述过,下方 wiki 页面里也有他博客地址。
具体可参考:http://zh.wikipedia.org/wiki/Active_Record
举个例子汇总一下这些名词的使用:
小强要开发一个应用,选择用MVC,先blabla……然后开始考虑Model
层,再blabla……具体到业务对象(business object)怎么持久,首选当然是关系型数据库,但直接写sql太费事,那就用ORM
,考虑怎么个映射法,就按Active Record
那样做吧,一表一个类,一行一对象。然后blabla……测试、修正、发布。一段时间后,需求变更,改!需要新增一个数据源(比如Memcached),卧槽,业务对象和数据源耦合住了,改个球,先重构,写几个DAO
塞进去,业务对象的数据从DAO
里获取,而DAO
来决定数据源。
……
refer:
http://stackoverflow.com/questions/6640784/difference-between-active-r...
and
http://stackoverflow.com/questions/3198419/orm-dao-datamapper-activere...
在做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的功能,他们既代表实体,包含业务逻辑,又是数据对象,并负责把自己存储到数据库中,当然,存储的这一部分代码是早已在模型的父类中实现好了的,属于框架的一部分,模型只需简单的调用父类的方法来完成持久化而已。
来源:http://blog.pengqi.me/2011/03/30/difference-between-model-dao-orm-and-...
每次看到这个话题都想说一个我的观点,在web开发中有一个常见的误区就是把model和orm等同起来
这个误区的原因是大量的web开发实际上就是对数据库的CRUD操作,业务逻辑几乎就等同于orm操作
实际上,model就是包含了业务逻辑的类,跟orm没有必然联系,只要你把一段业务逻辑封装到一个单独的类,这个类其实就是model
所以我读代码的时候,一旦看到这种代码
<code>php</code><code>class Foobar extends Model { } </code>
只说明一件事情,这个人或者框架作者并没有真正搞清楚model和orm的关系,因为业务逻辑是多变的,所以根本不应该存在什么model基类
推荐一个短小精悍的ActiveRecord库,lloydzhou/activerecord · GitHub, 可以实现类似Yii的relation的效果。文档地址:http://lloydzhou.github.io/activerecord/
<code>class User extends ActiveRecord{ public $table = 'user'; public $primaryKey = 'id'; public $relations = array( 'contacts' => array(self::HAS_MANY, 'Contact', 'user_id') ); } class Contact extends ActiveRecord{ } $user = new User(); // find one user var_dump($user->notnull('id')->orderby('id desc')->find()); echo "\nContact of User # {$user->id}\n"; // get contacts by using relation: // 'contacts' => array(self::HAS_MANY, 'Contact', 'user_id'), var_dump($user->contacts);</code>

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

Video Face Swap
완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











PHP 8.4는 상당한 양의 기능 중단 및 제거를 통해 몇 가지 새로운 기능, 보안 개선 및 성능 개선을 제공합니다. 이 가이드에서는 Ubuntu, Debian 또는 해당 파생 제품에서 PHP 8.4를 설치하거나 PHP 8.4로 업그레이드하는 방법을 설명합니다.

숙련된 PHP 개발자라면 이미 그런 일을 해왔다는 느낌을 받을 것입니다. 귀하는 상당한 수의 애플리케이션을 개발하고, 수백만 줄의 코드를 디버깅하고, 여러 스크립트를 수정하여 작업을 수행했습니다.

VS Code라고도 알려진 Visual Studio Code는 모든 주요 운영 체제에서 사용할 수 있는 무료 소스 코드 편집기 또는 통합 개발 환경(IDE)입니다. 다양한 프로그래밍 언어에 대한 대규모 확장 모음을 통해 VS Code는

JWT는 주로 신분증 인증 및 정보 교환을 위해 당사자간에 정보를 안전하게 전송하는 데 사용되는 JSON을 기반으로 한 개방형 표준입니다. 1. JWT는 헤더, 페이로드 및 서명의 세 부분으로 구성됩니다. 2. JWT의 작업 원칙에는 세 가지 단계가 포함됩니다. JWT 생성, JWT 확인 및 Parsing Payload. 3. PHP에서 인증에 JWT를 사용하면 JWT를 생성하고 확인할 수 있으며 사용자 역할 및 권한 정보가 고급 사용에 포함될 수 있습니다. 4. 일반적인 오류에는 서명 검증 실패, 토큰 만료 및 대형 페이로드가 포함됩니다. 디버깅 기술에는 디버깅 도구 및 로깅 사용이 포함됩니다. 5. 성능 최적화 및 모범 사례에는 적절한 시그니처 알고리즘 사용, 타당성 기간 설정 합리적,

문자열은 문자, 숫자 및 기호를 포함하여 일련의 문자입니다. 이 튜토리얼은 다른 방법을 사용하여 PHP의 주어진 문자열의 모음 수를 계산하는 방법을 배웁니다. 영어의 모음은 A, E, I, O, U이며 대문자 또는 소문자 일 수 있습니다. 모음이란 무엇입니까? 모음은 특정 발음을 나타내는 알파벳 문자입니다. 대문자와 소문자를 포함하여 영어에는 5 개의 모음이 있습니다. a, e, i, o, u 예 1 입력 : String = "Tutorialspoint" 출력 : 6 설명하다 문자열의 "Tutorialspoint"의 모음은 u, o, i, a, o, i입니다. 총 6 개의 위안이 있습니다

이 튜토리얼은 PHP를 사용하여 XML 문서를 효율적으로 처리하는 방법을 보여줍니다. XML (Extensible Markup Language)은 인간의 가독성과 기계 구문 분석을 위해 설계된 다목적 텍스트 기반 마크 업 언어입니다. 일반적으로 데이터 저장 AN에 사용됩니다

정적 바인딩 (정적 : :)는 PHP에서 늦은 정적 바인딩 (LSB)을 구현하여 클래스를 정의하는 대신 정적 컨텍스트에서 호출 클래스를 참조 할 수 있습니다. 1) 구문 분석 프로세스는 런타임에 수행됩니다. 2) 상속 관계에서 통화 클래스를 찾아보십시오. 3) 성능 오버 헤드를 가져올 수 있습니다.

PHP의 마법 방법은 무엇입니까? PHP의 마법 방법은 다음과 같습니다. 1. \ _ \ _ Construct, 객체를 초기화하는 데 사용됩니다. 2. \ _ \ _ 파괴, 자원을 정리하는 데 사용됩니다. 3. \ _ \ _ 호출, 존재하지 않는 메소드 호출을 처리하십시오. 4. \ _ \ _ get, 동적 속성 액세스를 구현하십시오. 5. \ _ \ _ Set, 동적 속성 설정을 구현하십시오. 이러한 방법은 특정 상황에서 자동으로 호출되어 코드 유연성과 효율성을 향상시킵니다.
