第二章、 文獻探討
2.2 Object Relational Mapping (ORM)
ORM 技術是隨著物件導向開發方法的發展而產生的,是一種為了解決物
12
ORM 技術在實現上根據[13]的分類,有 4 種常用的設計模式:
(1)Table Data Gateway 模式、(2)Row Data Gateway 模式、(3)Active Record 模式 和 (4)Data Mapper 模式。
2.2.1 Table Data Gateway 模式
根據[13]定義:Table Data Gateway 是扮演一個資料庫的角色,通過它 可以處理所有對資料庫表格的訪問和操作,如圖 6 所示。Table data gateway 封裝了所有操作資料庫 table 或 view 的 SQL 語法,如:select、insert、update、
delete 等。當程式調用此 gateway 物件的方法即可與資料庫互動,存取資料 庫的數據。
圖 6 Table Data Gateway 模式的示意圖 [13]
Table Data Gateway 的好處是提供了一個簡單的介面(interface)來存取資 料庫的數據,而且它通常是無狀態的,因為它只負責資料庫數據的傳遞而 已。
而使用 Table Data Gateway 需要考慮的問題是如何處理從請求中返回的 多項查詢值。一種做法是返回簡單的資料結構,比如 Map;另一種做法就是 使用 Data Transfer Object(一個封裝數據,純粹用於傳輸的物件),一般建議
13
採用 Data Transfer Object[4]。
2.2.2 Row Data Gateway 模式
根據[13]定義:Row Data Gateway 對應資料庫中的每一筆數據記錄,
它的一個實例(instance)就是一行記錄,資料庫表格中的每一欄位映射於該物 件中相應的成員(field)。因此它是有狀態的,不像 Table Data Gateway 只是 簡單的存取介面而已。
圖 7 Row Data Gateway 模式的示意圖 [13]
通常在設計 Row Data Gateway 時,會對資料庫中的每個表格對應一個 查詢類別,用以返回一個 gateway 物件作為其查詢的結果,如圖 7 所示。
值得一提的是 Row Data Gateway 和 Active Record 模式十分類似,區別 在於其中是否包含業務邏輯(domain logic)。Row Data Gateway 只是包含數 據存取的邏輯,而沒有任何業務邏輯;而 Active Record 則包含兩者。
14
2.2.3 Active Record 模式
根據[12][13]定義:Active Record 包裝了資料庫表格或視圖中的一筆數 據記錄,不但封裝資料庫的存取行為,也加入了該筆數據的業務邏輯,如圖 8 所示。Active Record 的資料結構應該要和資料庫表格的完全匹配,每個成 員皆要對應資料庫表格中的每一個欄位。並且成員的型別要和資料庫提供的 型別保持一致,並不需要在此階段手動的進行型別轉換。
Active Record 模式通常具有下列方法[12][13]:
透過 SQL 查詢結果建構一個 Active Record 物件
為插入資料庫操作預先生成一個 Active Record 物件
透過一個包含通用 SQL 查詢的靜態 Finder 方法,返回 Active Record 物 件
通過 Active Record 物件更新和插入資料庫數據
提供 Get/Set 成員
可實現部分業務邏輯
圖 8 Active Record 模式的示意圖 [13]
15
在業務邏輯比較簡單並且能和資料庫表格相互對應時,使用 Active Record 模式相對於 Gateway 模式更加合適。因為它包含了業務邏輯和數據存 取能力,並且不需要 Data Transfer Object,減少了維護的工作量。不過 Active Record 對資料庫的耦合程度較高。
2.2.4 Data Mapper 模式
根據[13]定義:Data Mapper 是 ORM 物件和資料庫之間傳遞數據的一個 中間層,使兩者保持獨立,如圖 9 所示。ORM 物件可以包含資料庫數據和 業務邏輯,數據存取的邏輯由 Data Mapper 完成,這使得 ORM 物件和資料 庫可以各自使用更符合自己的方式來組織數據的資料結構。Data Mapper 模 式將 ORM 物件與資料庫之間的耦合程度降至最低,甚至讓使用者只需操作 ORM 物件,無需再知道 SQL 和實質的資料庫。
通常使用 Data Mapper 需要藉由外部的配置文件儲存 ORM 物件與資料 庫的映射關係,例如 INI 或 XML 文件。這意味著使用此模式帶來良好的彈 性之外,也增加額外的管理開銷。因此,此模式較適用於資料庫與業務邏輯 映射關係複雜的大型專案[18]。
圖 9 Data Mapper 模式的示意圖 [13]
16
表 2 將針對 Table Data Gateway 模式、Row Data Gate 模式、Active Record 模式、DataMapper 模式等四種常見的 Object Relational Mapping 模式進行比 較。
表 2 ORM 設計模式比較表 Table Data
Gateway
Row Data Gateway
Active Record
Data Mapper
複雜程度 最低 低 中 高 key 時,所產生 value 的分散程度與生成速度為考量時,選擇 DJBX33A(Daniel J. Bernstein, Times 33 with Addition)演算法是最佳的選擇。其演算法如下: