ORM选型—DataMapper VS ActiveRecord

本文适合对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的典型示例为:

  1. 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的典型示例为:

  1. 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更加适合长线开发,保持业务逻辑与数据存储独立的复杂项目。除此之外,技术选型还要考虑其他因素,比如项目历史背景等等。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值