軟件工程中,主動記錄模式(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). 

外部連結

編輯