軟件工程中,主動記錄模式(active record pattern)是一種架構模式,可見於在關聯式資料庫中儲存主記憶體中對象的軟件中。它在Martin Fowler的2003年著《企業應用架構的模式》書中命名[1]。符合這個模式的對象的介面將包括函數比如插入、更新和刪除,加上直接對應於在底層資料庫表格中列的或多或少的屬性。

主動記錄模式是訪問在資料庫中的數據的一種方式。資料庫表視圖被包裝入。因此,對象實例被連結到這個表格的一個單一行。在一個對象建立之後,在儲存時將一個新行增加到表格中。載入的任何對象都從資料庫得到它的資訊。在一個對象被更新的時候,在表格中對應的行也被更新。包裝類為在表格或視圖中的每個列都實現訪問器方法或屬性。

這個模式常用於對象持久化工具和對象關係對映(ORM)之中。典型的,外來鍵聯絡也通過一個屬性而被顯露為適當類型的一個對象實例。

實現

編輯

這個概念的實現可以在很多編程環境中的各種框架中找到。例如,如果在資料庫中有一個表格parts,它具有列name(字串類型)和price(數值類型),而主動記錄模式用類Part來實現,偽碼為:

part = new Part()
part.name = "Sample part"
part.price = 123.45
part.save()

它在parts表格中建立有給定值的一個新行,並且粗略的等價於SQL命令:

INSERT INTO parts (name, price) VALUES ('Sample part', 123.45);

反過來,這個類可以被用來查詢這個資料庫:

b = Part.find_first("name", "gearbox")

這會找到一個新Part對象,基於在parts表格中其name列的值為"gearbox"的第一個匹配行。使用的SQL命令可能類似於下面所列,具體依賴於這個資料庫的SQL實現細節:

SELECT * FROM parts WHERE name = 'gearbox' LIMIT 1; -- MySQL or PostgreSQL

主動記錄框架

編輯

主動記錄框架一般兼有ORM框架的功能,但主動記錄不是簡單的ORM。關係型資料庫往往通過外來鍵來表述實體的聯絡,主動記錄在數據源層面上也將這種聯絡對映為對象的關聯英語Association (object-oriented programming)聚集英語Object composition#Aggregation。著名的例子是解決方案堆疊Web開發框架Ruby on Rails,其預設使用一個純Ruby寫成的主動記錄框架來驅動MVC中的模型層。此外還有:

類似模式

編輯

主動記錄和行數據門徑英語Row Data Gateway十分相似,但前者是領域模型模式,後者只是一種數據源模式。主動記錄適合非常簡單的領域需求,尤其在領域模型和資料庫模型十分相似的情況下。如果遇到更加複雜的領域模型結構(例如用到繼承、策略的領域模型),往往需要使用分離數據源的領域模型,結合數據對映器使用。

資料來源

編輯
  1. ^ Fowler, Martin. Patterns of enterprise application architecture. Addison-Wesley. 2003 [2020-11-07]. ISBN 978-0-321-12742-6. (原始內容存檔於2021-11-24). 承載數據和行為二者的對象。多數這種數據是持久化的並需要被儲存在資料庫中。主動記錄使用最明顯的方式,將數據訪問邏輯放置在領域對象中。這種方式下所有人都知道如何讀和寫他們的數據進出資料庫。 
  2. ^ Orator - An ActiveRecord ORM for Python. [2020-11-08]. (原始內容存檔於2020-12-16). 
  3. ^ ObjectiveSql頁面存檔備份,存於互聯網檔案館
  4. ^ JAVA 极速WEB+ORM框架 JFinal. [2020-11-08]. (原始內容存檔於2020-11-21). 

外部連結

編輯