2011-09-17 38 views
12

活動記錄模式和表數據網關模式之間的主要區別或主要區別是什麼?活動記錄和表數據網關之間的差異

我對編程相對比較陌生,所以如果這是一個愚蠢的問題,但是他們看起來和我很相似,我們是很抱歉的。

回答

15

這個答案就像大多數模式答案真的只是我的解釋,我說的大部分是基於Martin Fowler網站上的Active RecordTable Data Gateway描述。

密鑰引號這大約表數據網關:

充當網關(466)到一個數據庫表中的一個對象。一個 實例處理表中的所有行。

而這大約活動記錄:

在一個數據庫中的表或視圖包裝了一個行的對象,封裝 數據庫訪問,以及在該數據添加域邏輯。

因此,在最簡單的級別上,Table Data Gateway將數據庫表抽象出來,而Active Record將表中的一行包起來。

我從閱讀中得出的另一個關鍵點是活動記錄對象是域對象,這意味着您調用Update()以保存數據庫更改的對象也是包含業務邏輯的對象。對於表數據網關,情況並非如此,網關通常充當將數據庫調用的輸出轉換爲域對象的層,並且當您想要將更改保存到這些對象時,將其傳遞迴網關並告訴網關保存。

最後,Table Data Gateway在整個表上工作的這一事實在設計和您對數據訪問的看法方面很重要。

我從來沒有特別使用過活動記錄,但曾在一個使用Table Data Gateway的大型項目中進行過設計。這是一個穩定的模式,但很多人會說它已經過時了 - 將所有數據訪問保存在一個地方並允許DBA擁有數據庫的好處已經被ORM的新優勢所取代,這些優勢爲開發人員提供了良好的對象在開發時間和透明度方面具有相應優勢的面向數據處理方法。 (我並不真的熱衷於評論上述段落​​的多少是正確的 - 我只是想表達一些社區意見,我目前使用ORM,但也可以愉快地回到網關方式)

1

活動記錄是表示正在修改的記錄的對象。這些對象有助於保持數據庫中的對象狀態一致。當您操作其狀態時,該記錄處於活動狀態,這將避免其他人同時修改它的機會。

0

這是實現雙方
活動記錄只是例子

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