什麼是物件-關係映射 (ORM)?
物件-關係映射 (ORM) 是抽象化程式設計語言實體 (物件) 與其對應資料庫元素之間連線的程序。
在建置應用程式時,程式設計人員在程式碼中定義對應於現實概念的物件。在程式碼中操控物件資料,但這些資料儲存在由資料系統設計定義的資料庫中。例如,您在程式碼中可能有包含客戶資訊的客戶物件,但基礎資料庫可能在多個資料表中儲存該資料。
物件-關係映射是一個軟體層,可將物件資料轉換到基礎資料庫,同時抽象化來自程式設計人員的資料庫詳細資訊。這樣,即使基礎資料庫採用全新或不同的設計,程式碼仍保持不變。藉助物件-關係映射,可以建立易於管理和維護的模組化應用程式。
物件-關係映射如何運作?
物件-關係映射 (ORM) 將使用物件導向程式設計 (OOP) 語言編寫的應用程式連線至基礎資料庫。這些類型的應用程式和資料庫通常會共同使用,但每個應用程式以不同方式處理資料。在兩者之間加入物件-關係映射可讓每個應用程式或資料庫以其他應用程式或資料庫理解的格式傳送資料。您可以修改兩者之一,而不會影響另一個。
物件導向程式設計語言
OOP 語言將資料組織為物件,這些物件是具有一個或多個屬性的程式碼結構。例如,在 OOP 應用程式中,您可以定義以資料持久性類別表示的物件,例如汽車,該物件具有品牌、型號、VIN、顏色和里程等屬性。
一些最受歡迎的物件導向程式設計 (OOP) 語言包括 Python、Java、JavaScript 和 .NET/C#。
關聯式資料庫
關聯式資料庫將資料結構化為資料表,類似於一系列連線的試算表。每個資料表都由一組資料欄組成,這些資料欄的每一個資料列中包含唯一記錄。
例如,您的汽車資料庫可能有多個資料表。其中一個資料表可以包含品牌資料,例如品牌、型號和 VIN。 另一個資料表可以儲存個別汽車的屬性,例如車主、顏色和里程。一些最受歡迎的關聯式資料庫包括 MySQL、PostgreSQL 和 SQL Server。
在 Web 開發中,物件-關係映射 (ORM) 工具將從物件導向應用程式傳送的資料轉換為關聯式資料庫,而不需要應用程式知道資料在資料庫中的結構化方式。
物件-關係映射
您可以建立物件-關聯映射 (有時稱為物件-關係管理員),該映射指示資料庫在何處找到應用程式請求的所有資料,即使每個結構以不同的方式儲存其資料亦不受影響。當您的應用程式請求個別汽車的所有屬性時,ORM 會指示資料庫如何在多個資料表中擷取所有該資料。
由於映射進行抽象化,因此如果資料庫結構發生變更或您移轉到新資料庫,ORM 仍然可以指向正確的資料,而且僅需最少量的更新。
常見的 ORM 架構
ORM 工具或架構可用於在許多最受歡迎的物件導向程式設計語言中進行資料建模。一些最受歡迎的 ORM 工具包括:
- Hibernate for Java
- SQLAcademy for Python
- Entity Framework for .NET/C#
ORM 和 ORDBMS 有何區別?
物件-關係資料庫管理系統 (ORDBMS) 是一種使用關係和物件導向架構元素的資料庫類型。它可以儲存結構化為物件的記錄,類似於可以使用 OOP 語言編碼的內容。但是,也可以對這些記錄執行類似 SQL 的關係查詢。這種功能組合可讓您儲存比標準關聯式資料庫更廣泛的資料類型。
物件-關係映射 (ORM) 是在應用程式層級運作的資料抽象,而 ORDBMS 則直接在資料庫層級提供物件導向功能。
ORM 在您的應用程序程式碼中執行,並在幕後產生 SQL。ORDBMS 在資料庫層級管理資料儲存和查詢執行,並且原生支援進階物件類型。
ORM 和 SQL 有何區別?
SQL (結構化查詢語言) 是用於與關聯式資料庫互動的標準語言。該語言可讓您建立和管理資料庫結構描述,插入和更新資料,以及使用聲明式命令查詢記錄。
SQL 提供針對資料庫的直接、低層級控制。ORM 提供更高層級、更加抽象的介面,並且通常可加快開發速度且使程式碼更易於維護。
ORM 非常適合簡化常見資料庫任務並與應用程式碼一致,但是當您需要執行效能調整、複雜查詢或完全控制資料存取時,SQL 仍然至關重要。
為什麼要使用 ORM 而非 SQL 查詢?
SQL 要求您手動編寫命令以與資料庫互動,而 ORM 會自動將您的物件導向程式碼轉換為幕後的 SQL。
ORM 有助於減少開發必須進行許多資料庫查詢的物件導向程式所需的編碼量。開發人員不需要手動程式設計多個需要維護的資料庫查詢,而是針對如何向 ORM 傳送請求進行程式設計。
使用更易於理解的程式設計語言也可使程式碼更容易讀取和偵錯。
使用物件-關係映射有哪些優勢?
ORM 系統帶來以下優勢。
加快應用程式開發
ORM 有助於使用開發人員最熟悉之 OOP 語言中的可理解程式碼擷取複雜的資料。它們可以處理例行的資料庫操作,例如建立、讀取、更新和刪除記錄 (CRUD),因此開發人員不必在應用程式中重複編碼這些操作。
簡化應用程式維護
透過 ORM 抽象化資料庫查詢,開發人員可以使用單一語言工作,使其程式碼更易於理解和維護。
提高安全性
SQL 隱碼攻擊是透過應用程式上的使用者表單傳送 SQL 查詢來存取私有資料的惡意嘗試。ORM 使用參數化查詢,這些查詢首先向您的資料庫傳送具有預留位置值而非真實資料的查詢 (例如,? 或 :param)。真實資料單獨傳送。這可確保將使用者輸入視為資料,而不是可執行的 SQL 程式碼。使用 ORM 工具可以防止透過 SQL 隱碼攻擊未經授權存取資料。
改善效能
ORM 可以透過在應用程式層中啟用透明物件快取來改善系統效能。它可以將最常擷取的資料儲存在更靠近應用程式的位置,從而加快存取速度。
使用物件-關係映射有哪些挑戰?
ORM 提出以下挑戰。
阻抗不相符
複雜的資料結構可能很難在物件導向程式與資料庫之間進行映射。無論您的 ORM 有多精細,在資料庫中表示可在 OOP 中編碼的階層均非常具有挑戰性。
更高複雜性的效能問題
相比於使用 ORM,直接查詢資料庫具有更高的運算效率。對於高度複雜的查詢,使用 SQL 程式碼而不是物件-關係映射 (ORM) 工具可能更有效率。
學習曲線
雖然 ORM 可以幫助您避免學習複雜的 SQL 程式碼,但開發人員仍需要學習如何使用 ORM 工具。
何時應該使用物件-關係映射?
由於 ORM 工具會抽象並自動化資料庫查詢,因此開發人員可以將更多的精力集中在應用程式上,而不是編碼可能複雜的查詢。考慮在下列情況下使用 ORM:
您的應用程式有許多物件
手動建置針對複雜物件介面和結構的查詢可能是一項耗時且費力的任務。允許 ORM 工具將物件映射到儲存在資料庫中的資料可以更加快速、可靠地執行準確的擷取。
您的應用程式重複類似的資料庫查詢
ORM 可以輕鬆地自動執行許多例行 CRUD 操作 (建立、讀取、更新和刪除資料),因此可減少所需的 SQL 程式碼。
結構描述持續演變
如果您的資料模型仍在不斷進化,ORM 可以協助更輕鬆地管理資料庫結構描述變更。許多 ORM 都包含移轉工具,可讓您以結構化的方式進行版本化和套用變更,並且降低跨環境不一致的風險。
資料庫可攜性至關重要
ORM 是一個抽象層,它目的明確地將應用程式調用的操作與任何特定資料庫分離。雖然不能保證完全可攜性,但這種抽象化可減少在系統之間移動所需的工作。因此,舉例而言,如果您的汽車應用程式需要從使用 MySQL 資料庫切換至 PostgreSQL,則不需要重寫整個應用程式。如果任何資料表變更,您僅需要對 ORM 進行輕微調整。
何時不應該使用物件-關係映射?
雖然物件-關係映射器是強大的工具,但仍然存在該工具並非最佳解決方案的具體情況。
簡單的資料庫互動
如果您正在建置僅執行簡單 CRUD 操作的應用程式,則維護 ORM 所需付出的時間和精力可能要多於簡單地在應用程式中手動維護查詢。
高效能運算至關重要時
對於許多應用程式,ORM 新增的額外運算時間和資源無關痛癢。但對於即時分析之類毫秒之差的任務,這些額外的運算時間和資源可能不可接受。
需要使用非標準化結構描述時
在某些情況下,開發人員可能希望在資料庫 Web 服務中的多個資料表之間維持備援資料 (稱為非標準化結構描述)。當應用程式需要進行聯結許多資料表的複雜關係查詢時,這可以提高效能。在 ORM 中映射這些查詢並非始終有效。
AWS 如何協助您達成資料管理要求?
AWS 提供一系列雲端資料庫解決方案,實現更加高效且經濟實惠的資料管理。
Amazon Relational Database Service (Amazon RDS) 是一項受管服務,可輕鬆設定、操作和擴展雲端中的關聯式資料庫。此服務不僅可用於管理耗時的資料庫管理任務,也提供經濟實惠且可調整大小的容量,讓您能夠挪出時間專注於應用程式和業務。
Amazon Aurora 是一項現代化的關聯式資料庫服務,可大規模提供高效能和高可用性。該服務提供完全開放原始碼的 MySQL 和 PostgreSQL 相容版本,同時提供一系列開發人員工具,用於建置無伺服器和機器學習 (ML) 驅動的應用程式。
Amazon Redshift 支援大規模的現代化資料分析,相比於其他雲端資料倉儲提供高達三倍的價格效能和七倍的輸送量。
Amazon DocumentDB (with MongoDB compatibility) 是一種快速、可擴展、高度可用且完全受管的企業文件資料庫,其將資料儲存在類似 JSON 物件的文件中。這些文件資料庫使用從原生物件傳回至開發人員所使用程式設計語言的驅動程式,從而無需使用 ORM 工具。
立即建立免費帳戶,開始在 AWS 上使用資料庫。