軟件工程中,主動記錄模式(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十分相似,但前者是領域模型模式,後者只是一種數據源模式。主動記錄適合非常簡單的領域需求,尤其在領域模型和數據庫模型十分相似的情況下。如果遇到更加複雜的領域模型結構(例如用到繼承、策略的領域模型),往往需要使用分離數據源的領域模型,結合數據映射器使用。

資料來源

外部連結

Wikiwand in your browser!

Seamless Wikipedia browsing. On steroids.

Every time you click a link to Wikipedia, Wiktionary or Wikiquote in your browser's search results, it will show the modern Wikiwand interface.

Wikiwand extension is a five stars, simple, with minimum permission required to keep your browsing private, safe and transparent.