对象关系映射

物件關聯對映（，簡稱ORM，或O/RM，或O/R mapping tool）是计算机科学中的一种程式設計技術，用於在關聯式資料庫和物件導向編程語言的內存（通常是堆）之間轉換數據。這實際上創建了一個可在編程語言中使用的「虛擬物件資料庫」。

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

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

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

 概述 
存儲驅動程序的實現細節通常封裝在使用語言的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常減少需編寫的代碼量。

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

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

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

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

 挑戰 
將物件系統匹配到關係數據庫時會出現多種難題，稱為物件關聯阻抗不匹配。物件關聯對映再探：數據庫技術對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)

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

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

 參見 
对象关系映射软件列表
对象关系映射软件比较
AutoFetch - 自動查詢優化
CORBA
对象数据库
对象持久化
对象关系数据库
对象关系阻抗不匹配
关系模型
SQL
Java 数据对象
Jakarta Persistence
服务数据对象
Entity Framework
主动记录
数据映射器模式
单表继承

 参考文献 

 外部連結 
 關於ORM  by Anders Hejlsberg 
 將物件映射到關係數據庫：O/R映射詳述  by Scott W. Ambler

Category:物件關聯對映
Category:資料映射
Category:含有示例C Sharp代码的条目