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