Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Design patterns 活动记录和表数据网关之间的差异_Design Patterns_Activerecord - Fatal编程技术网

Design patterns 活动记录和表数据网关之间的差异

Design patterns 活动记录和表数据网关之间的差异,design-patterns,activerecord,Design Patterns,Activerecord,活动记录模式和表数据网关模式之间的主要区别是什么 我对编程比较陌生,所以如果这是一个愚蠢的问题,我深表歉意,但它们似乎与我非常相似。这个答案就像大多数模式答案一样,实际上只是我的解释,我所说的大部分内容都是基于Martin Fowler网站上的内容和描述 关键引号是关于表数据网关的: 充当数据库表的网关(466)的对象。一个 实例处理表中的所有行 关于活动记录: 在数据库表或视图中封装行的对象 数据库访问,并在该数据上添加域逻辑 因此,在最简单的级别上,表数据网关抽象数据库表,而活动记录从表中包

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


我对编程比较陌生,所以如果这是一个愚蠢的问题,我深表歉意,但它们似乎与我非常相似。

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

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

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

关于活动记录:

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

因此,在最简单的级别上,表数据网关抽象数据库表,而活动记录从表中包装行

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

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

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


(我并不想评论以上段落中有多少内容是正确的——我只是想表达一些社区意见。我目前使用ORM,但也可以很高兴地回到网关方法)

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

这只是实现两者的示例
活动记录

class活动记录
{
受保护的$connection=null;
公共函数构造()
{
$this->connection=new-PDO(“mysql:host=localhost;dbname=db_userscloud”,“root',”);
}
公共函数loadId($id)
{
$sql='SELECT*FROM blog WHERE id_blog='(int)$id;
$result=$this->connection->query($sql);
$record=$result->fetch(PDO::fetch_ASSOC);
foreach($column=>$value记录){
$this->$column=$value;
}
}
}
$blog=新的ActiveRecord();
$blog->loadId(1);
echo$blog->id\u blog
; echo$blog->title\u blog;

表数据

类表数据
{
受保护的$connection=null;
公共函数构造()
{
$this->connection=new-PDO(“mysql:host=localhost;dbname=db_userscloud”,“root',”);
}
公共函数loadId($id)
{
$sql='SELECT*FROM blog WHERE id_blog='(int)$id;
$result=$this->connection->query($sql);
返回$result->fetch(PDO::fetch_ASSOC);
}   
$gateway=newtabledata();
$blog=$gateway->loadId(1);
echo$blog['id_blog'].
; echo$blog['title_blog'];
  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'];