Active Record 和表数据网关的区别

Posted

技术标签:

【中文标题】Active Record 和表数据网关的区别【英文标题】:Differences between Active Record and Table Data Gateway 【发布时间】:2011-11-19 10:18:33 【问题描述】:

活动记录模式和表数据网关模式的主要区别是什么?

我对编程比较陌生,如果这是一个愚蠢的问题,我很抱歉,但它们看起来和我很相似。

【问题讨论】:

【参考方案1】:

这个答案就像大多数模式的答案一样,实际上只是我的解释,我所说的大部分内容都是基于 Martin Fowler 网站上的 Active Record 和 Table Data Gateway 描述。

关于表数据网关的关键引述如下:

充当数据库表的网关 (466) 的对象。一 实例处理表中的所有行。

关于 Active Record:

在数据库表或视图中包装一行的对象,封装 数据库访问,并在该数据上添加域逻辑。

所以在最简单的层面上,Table Data Gateway 抽象了一个数据库表,而 Active Record 包装了一个表中的一行。

我读到的另一个关键点是 Active Record 对象是域对象,这意味着您调用 Update() 来保存数据库更改的对象也是包含业务逻辑的对象。对于表数据网关,情况并非如此,网关通常充当一个层,将数据库调用的输出转换为域对象,当您想要对这些对象进行持久更改时,您将返回给网关并告诉保存的网关。

最后,表数据网关适用于整个表这一事实在设计和您如何看待数据访问方面非常重要。

我从未特别使用过 Active Record,但曾参与过一个在设计中使用表数据网关的大型项目。这是一个可靠的模式,但很多人会说它已经过时了——将所有数据访问保存在一个地方并允许 DBA 拥有数据库的优势已经被 ORM 的新优势所取代,它为开发人员提供了良好的对象面向数据的处理方法,在开发时间和透明度方面具有相应的优势。

(我并不热衷于评论上述段落​​中有多少是真实的 - 我只是试图代表一些社区意见。我目前使用 ORM,但也可以很高兴地回到网关方法)

【讨论】:

【参考方案2】:

这只是 Active Record

的实现示例
  class ActiveRecord
  
    protected $connection = null;

    public function __construct()
    
      $this->connection = new PDO("mysql:host=localhost; dbname=db_userscloud", 'root', '');
    

    public function loadId($id)
    
      $sql    = 'SELECT * FROM blog WHERE id_blog = ' . (int) $id;
      $result = $this->connection->query($sql);

      $record = $result->fetch(PDO::FETCH_ASSOC);

      foreach($record as $column => $value) 
        $this->$column = $value;
      

    
  

  $blog  = new ActiveRecord();
  $blog->loadId(1);

  echo $blog->id_blog . '<br />'; 
  echo $blog->title_blog;

表格数据

  class TableData
  
    protected $connection = null;

    public function __construct()
    
      $this->connection = new PDO("mysql:host=localhost; dbname=db_userscloud", 'root', '');
    

    public function loadId($id)
    
      $sql    = 'SELECT * FROM blog WHERE id_blog = ' . (int) $id;
      $result = $this->connection->query($sql);

      return $result->fetch(PDO::FETCH_ASSOC);                          
       

  $gateway  = new TableData();
  $blog     = $gateway->loadId(1);

  echo $blog['id_blog'] . '<br />'; 
  echo $blog['title_blog'];

【讨论】:

【参考方案3】:

活动记录是表示正在修改的记录的对象。这些对象有助于在数据库中保持对象状态的一致性。该记录在您操作其状态时处于活动状态,这将避免其他人同时修改它的机会。

【讨论】:

以上是关于Active Record 和表数据网关的区别的主要内容,如果未能解决你的问题,请参考以下文章

Rails 中的 Active Record 和 ORM 有啥区别?

Active Record Query Interface 数据查询接口(界面)

Active Record基础

如何使用 Active Record 回滚特定数据库

业务逻辑层-Active Record

如何使用 Active Record 查找具有重复数据的记录