ORM选型—DataMapper VS ActiveRecord
来源:互联网 发布:华为p9忽略电池优化 编辑:程序博客网 时间:2024/05/16 14:27
本文适合对ORM(对象-关系模型)比较感兴趣的同学阅读,需要具备一定的数据库基础知识。
一、背景
在web后台开发领域,经常会遇到应用程序操作数据库的场景,目前市面上存在的数据库包括mysql、postgresql、oracle、sqlite等,为了屏蔽不同数据库的差异,产生了ORM(Object-Relational-Mapping),在实现层面,又分为DataMapper和ActiveRecord两种。
二、ORM
上图展示了增加ORM前后数据操作的差异性,很明显,ORM具有以下优点:
屏蔽底层不同数据库的差异,应用程序只需要调用ORM封装好的接口即可,业务逻辑代码清晰
ORM将Object对象与Relation关系映射,使得应用程序无需编写sql,只需要按照面向对象的思维编写代码,无需关心数据存储
有些ORM还提供了类似读写分离、sharding数据分片等功能供业务直接使用
....
总之,增加中间层的优点很多,包括可以在ORM上统计分析sql,执行合并插入或更新数据库等。
三、DataMapper OR ActiveRecord
具体到实现层面,业界已经有很多成熟的ORM实现方案,但无非两种,DataMapper和ActiveRecord,就PHP领域来说,对应的开源实现为Doctrine和Eloquent。
1.DataMapper
以Doctrine为例,DataMapper的典型示例为:
class Product{ protected $id; protected $name; public function getId() { return $this->id; } public function getName() { return $this->name; } public function setName($name) { $this->name = $name; }}$config = Setup::createXMLMetadataConfiguration([__DIR__."/config/xml"], $isDevMode);$connection = [ 'driver' => 'mysql', 'url' => "mysql://user:password@127.0.0.1:3306/database"];$entityManager = EntityManager::create($connection, $config);$product = new Product();$product->setName("DataMapper");$entityManager->persist($product);$entityManager->flush();
DataMapper使用过程中会存在一个mapper,在这里,entityManager充当了mapper的角色,负责管理所有的entity。代码中只需要设置好$product对象之后,使用entityManager->persist和flush将数据持久化到数据库。
也就是说,业务只需要配置和数据库映射的字段和规则,就可以使用entityManager提供的接口来代替数据库增删查改的操作。整个操作的结构图为:
2.ActiveRecord
以Eloquent为例,ActiveRecord的典型示例为:
use Illuminate\Database\Capsule\Manager;use Illuminate\Database\Eloquent\Model;Manager::schema()->create('product', function ($table) { $table->increments('id'); $table->string('name');});class Product extends Model{ protected $table = "product";}$product = new Product();$product->name = "ActiveRecord";$product->save();
相比DataMapper,ActiveRecord少了一层mapper,但是业务逻辑中的每个类都需要继承统一的基类Model,Model中包含了增删查改涉及到的接口,如save、find等。业务对象Object与数据库Record之间依赖字段名和列属性衔接。整个操作的结构图为:
3.选型
由上面的分析可知,DataMapper使用单独的Mapper处理对象到数据库的增删查改,ActiveRecord需要类继承统一的Model类来完成这些操作。也就是说,DataMapper对业务代码侵入性小,而ActiveRecord直接在对象上操作,代码编写更方便一些。 因此,笔者认为,ActiveRecord更加适合快速开发成型的短期简单项目,而DataMapper更加适合长线开发,保持业务逻辑与数据存储独立的复杂项目。除此之外,技术选型还要考虑其他因素,比如项目历史背景等等。
想要获取最新技术文章?欢迎订阅微信公众号----软件编程之路
- ORM选型—DataMapper VS ActiveRecord
- DataMapper
- 单一入口、MVC、ORM、CURD、ActiveRecord概念
- MVC、OOP、ORM、CURD、ActiveRecord概念
- Ibatisnet源码解读(2)—DataMapper
- 文件系统vs对象存储——选型和趋势
- 文件系统vs对象存储——选型和趋势
- OOP MVC ORM CURD ActiveRecord 单一入口 的概念
- ActiveRecord
- ActiveRecord
- ActiveRecord
- 服务器选型:x86 vs 小型机谁更胜一筹?
- ActiveMQ VS jBossMQ的选型讨论...
- ffmpeg statis vs dev技术选型?
- atitit.orm的缺点与orm框架市场占有率,选型attilax总结
- HTML5 vs Hybrid APP vs Native APP和技术选型
- PHP ORM框架Propel VS Doctrine
- 应用层缓存 VS ORM缓存
- 利用线程将网络指定的图片下载到本地,将文件分四次下载,结果并未实现QAQ求大神指教下
- 阻塞,非阻塞,同步,异步
- 搜狗2015java工程师笔试题总结
- ServiceManager Hook原理
- 使用C3P0报错:java.lang.NoClassDefFoundError: com/mchange/v2/ser/Indirector
- ORM选型—DataMapper VS ActiveRecord
- 多播地址知识
- 09:膨胀的木棍
- Windows PowerShell 实战指南-动手实验-6.7
- bash的特殊用法:-和利用日期进行文件创建
- I
- 【搜索入门专题1】hdu1548 G
- 【怎样写代码】工厂三兄弟之抽象工厂模式(四):抽象工厂模式
- python数字图像处理(1):环境安装与配置