主動記錄
在軟體工程中,主動記錄模式(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。關係型資料庫往往通過外來鍵來表述實體的聯絡,主動記錄在資料來源層面上也將這種聯絡對映為對象的關聯和聚集。著名的例子是解決方案堆疊Web開發框架Ruby on Rails,其預設使用一個純Ruby寫成的主動記錄框架來驅動MVC中的模型層。此外還有:
類似模式
主動記錄和行資料門徑十分相似,但前者是領域模型模式,後者只是一種資料來源模式。主動記錄適合非常簡單的領域需求,尤其在領域模型和資料庫模型十分相似的情況下。如果遇到更加複雜的領域模型結構(例如用到繼承、策略的領域模型),往往需要使用分離資料來源的領域模型,結合資料對映器使用。
資料來源
- ^ Fowler, Martin. Patterns of enterprise application architecture. Addison-Wesley. 2003 [2020-11-07]. ISBN 978-0-321-12742-6. (原始內容存檔於2021-11-24).
承載資料和行為二者的對象。多數這種資料是持久化的並需要被儲存在資料庫中。主動記錄使用最明顯的方式,將資料訪問邏輯放置在領域對象中。這種方式下所有人都知道如何讀和寫他們的資料進出資料庫。
- ^ Orator - An ActiveRecord ORM for Python. [2020-11-08]. (原始內容存檔於2020-12-16).
- ^ ObjectiveSql (頁面存檔備份,存於網際網路檔案館)
- ^ JAVA 极速WEB+ORM框架 JFinal. [2020-11-08]. (原始內容存檔於2020-11-21).
外部連結