跳至內容

對象關係對映

本頁使用了標題或全文手工轉換
維基百科,自由的百科全書

物件關聯對映(英語:Object–relational mapping,簡稱ORM,或O/RM,或O/R mapping tool)是電腦科學中的一種程式設計技術,用於在關聯式資料庫物件導向程式語言的主記憶體(通常是)之間轉換數據。這實際上創建了一個可在程式語言中使用的「虛擬物件資料庫」。

物件導向程式設計中,數據管理任務操作於將標量值組合為物件的物件。例如,一個包含個人資訊及多個電話號碼和地址的地址簿條目。在物件導向實現中可建模為「Person物件」,其包含條目所組成的每個數據項的屬性/欄位:人名、電話號碼列表和地址列表。電話號碼列表本身包含「PhoneNumber物件」等。每個地址簿條目被程式語言視為單個物件(例如可通過包含指向該物件指針的單個變量參照)。各種方法可與物件關聯,例如返回首選電話號碼、家庭地址等方法。

相比之下,如SQL關聯式資料庫將標量分組為元組,再列舉於中。元組與物件有相似性(都將值收集到命名欄位使整個集合可作為單個複合實體操作),但存在諸多差異:生命週期管理(行插入/刪除 vs 垃圾回收/參照計數)、參照其他實體(物件參照 vs 外鍵參照)、繼承(關系數據庫中不存在)。物件在堆上管理且由單個進程完全控制,而數據庫元組共用且需包含鎖定、合併和重試。物件關聯對映提供自動支援將元組對映到物件並返回,同時解決所有這些差異。[1]

問題核心在於將物件的邏輯表示轉換為可儲存於數據庫中的原子化形式,同時保留物件及其關係的屬性,以便需要時可重新載入為物件。若實現此儲存檢索功能,則稱物件為持久的。[1]

概述

[編輯]

儲存驅動程式的實現細節通常封裝在使用語言的API中,以更簡潔且符合周邊代碼範式的方式暴露與儲存介質互動的方法。

以下為使用C#代碼的簡單範例,通過數據庫引擎執行SQL查詢:

var sql = "SELECT id, first_name, last_name, phone, birth_date, sex, age FROM persons WHERE id = 10";
var result = context.Persons.FromSqlRaw(sql).ToList();
var name = result[0]["first_name"];

相比之下,以下利用ORM-job API可更自然地編寫使用語言特性的代碼:

var person = repository.GetPerson(10);
var firstName = person.GetFirstName();

上例使用代表儲存庫的物件及其方法。其他框架可能提供靜態方法如下例,還有其他方法可能完全不實現物件導向系統。範式選擇通常取決於ORM與周邊語言設計原則的最佳契合。

var person = Person.Get(10);

與傳統數據訪問技術的比較

[編輯]

相較於物件導向語言與關系數據庫間交換的傳統技術,ORM常減少需編寫的代碼量。[2]

ORM工具的缺點通常源於高層次抽象遮蔽了實現代碼中的實際操作。

物件導向數據庫

[編輯]

另一方法是使用物件導向數據庫管理系統(OODBMS)或文件導向數據庫(如原生XML數據庫)以提供更靈活的數據建模。OODBMS是專為處理物件導向值設計的數據庫。使用OODBMS無需將數據轉換為SQL形式,因數據以其原始物件形式儲存且關係直接表示,無需聯接表/操作。文件導向數據庫的ORM等效物稱為物件檔案對映器(ODM)。

文件導向數據庫還防止用戶將物件"分解"為表行。許多此類系統也支援XQuery查詢語言檢索數據集。

物件導向數據庫傾向用於複雜的利基應用。反對使用OODBMS的論點之一是其可能無法執行臨時的、與應用無關的查詢。[來源請求]因此許多程式設計師更習慣物件-SQL對映系統,儘管多數物件導向數據庫能有限處理SQL查詢。其他OODBMS提供到SQL數據庫的複製,以滿足臨時查詢需求同時保留已知查詢模式。[來源請求]

挑戰

[編輯]

將物件系統匹配到關系數據庫時會出現多種難題,稱為物件關聯阻抗不匹配[3]

實現ORM的替代方案是使用每個主要數據庫內建的原生過程語言。可通過SQL陳述式從客戶端調用。數據訪問物件(DAO)設計模式用於抽象這些陳述式,並為應用其餘部分提供輕量級物件導向介面。[4]

ORM限於其預定義功能,可能無法涵蓋所有邊緣案例或數據庫特性。通常通過提供編寫原始查詢的介面來緩解此限制,如Django ORM。[5]

參見

[編輯]

參考文獻

[編輯]
  1. ^ 1.0 1.1 What is Object/Relational Mapping?. Hibernate Overview. JBOSS Hibernate. [2022-01-27] (美國英語). 
  2. ^ ((Barry, D.)), ((Stanienda, T.)). Solving the Java object storage problem. Computer (Institute of Electrical and Electronics Engineers (IEEE)). 1998, 31 (11): 33–40. doi:10.1109/2.730734. 此練習中,使用ODMG Java綁定需496行代碼,而使用JDBC需1,923行。 
  3. ^ 物件關聯對映再探:數據庫技術對O/R對映策略影響的定量研究。M Lorenz, JP Rudolph, G Hesse, M Uflacker, H Plattner。Hawaii International Conference on System Sciences (HICSS), 4877-4886 (DOI:10.24251/hicss.2017.592)
  4. ^ Feuerstein, Steven; Bill Pribyl. Oracle PL/SQL Programming. 18.5 修改持久物件. 1997-09 [2011-08-23] (美國英語). 
  5. ^ 執行原始SQL查詢 | Django文檔. Django Project. [2024-09-08] (英語). 

外部連結

[編輯]