Active Record和Table Data Gateway之间的差异

时间:2011-09-17 20:25:15

标签: design-patterns activerecord

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

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

3 个答案:

答案 0 :(得分:16)

这个答案就像大多数模式答案真的只是我的解释一样,我所说的大多数都是基于Martin Fowler网站上的Active RecordTable Data Gateway描述。

关键引用是关于表数据网关的:

  

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

关于Active Record:

  

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

因此,在最简单的层面上,Table Data Gateway抽象数据库表,而Active Record则从表中包装一行。

我从阅读中得到的另一个关键点是,Active Record对象是域对象,这意味着您调用Update()以保存数据库更改的对象也是包含业务逻辑的对象。对于表数据网关,情况并非如此,网关通常充当将数据库调用的输出转换为域对象的层,并且当您希望对这些对象保持更改时,将其传递回网关并告诉保存的网关。

最后,表格数据网关在整个表格上工作的这一事实在设计和您对数据访问的考虑方面非常重要。

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

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

这只是实施双方的例子 有效记录

  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'];