彌合對象、關係之間的鴻溝(1/10)

O/RM技術能夠簡化數據訪問,但也須要注意到引入這個新的抽象層來的挑戰。程序員

關鍵字:對象-關係映射數據庫

  現代的應用程序經常是使用兩種大相徑庭的技術構建而成:業務邏輯部分使用面向對象編程,數據存儲使用關係型數據庫。面向對象編程是實現複雜的系統的一個關鍵技術,它提供的好處包括可重用性、健壯性和可維護性。關係型數據庫是保存數據的倉庫。O/RM(對象關係映射)則是二者之間的橋樑,它容許應用程序以面向對象的方式訪問關係數據。 編程

  O/RM是對象持久化的一個專業化的通常概念。IBM研究員格雷迪·布赫在他的書《面向對象的分析與應用設計》中,將「持久性」定義爲「在程序生命週期以外的數據」,是對象模型1中的次要元素。然而,在現代應用程序中,貢獻在持久化上的工做量,有時能夠主宰一個項目的成本,而使用O/RM工具,能夠顯着下降成本。服務器

  有一些其餘技術能夠用於從面向對象的程序訪問關係型數據,但這些技術通常不利用編程語言的對象模型特性。要充分利用對象模型的特性,數據庫訪問技術須要支持信息隱藏、關注點分離、繼承、變化檢測、惟一性保持和數據庫獨立性。 數據結構

  關注點分離是將一個程序分爲一些邏輯部分的過程,這些部分有不多或根本沒有重疊。在數據庫編程中有幾部分應分開:1)業務方法中查找和操做領域對象的方法;2)領域對象中可能會致使內部狀態的變化的方法和可能會調用相關聯的對象方法的方法;3)生成的數據庫命令中對行和列執行插入,查詢,更新,和刪除的;4)以及用於數據庫事務劃分的方法。app

  信息隱藏是關注點分離的一個實現策略,此策略根據接口定義的行爲實現特定的類,以下降複雜性和成本。類實現的行爲要和調用者的行爲分開。改變一方的行爲並不必定須要也改變另外一方。編程語言

  繼承容許代碼的重用,一些相關聯的類中共同的行爲只被定義一次,具備惟一性的行爲只在類之間的行爲不一樣的地方實現。如此,一個類的行爲和子類或父類(超類)的行爲相較,多是相同或不一樣的,而且此行爲獨立於調用者的行爲。工具

  變化檢測在一個數據庫事務中一直跟蹤領域對象的變化,因此在事務結束時,更改將應用到數據庫。 設計

  惟一性保持是數據庫交互中的一個屬性,在交互中一個獨立領域實例對應一個數據庫行,而無論用戶是如何得到對象的:經過查詢數據庫,從一個實例的引用導航到另外一個,或經過提供其首要識別符找到一個肯定的領域實例。倘若沒有惟一性保持,對一個領域實例進行的更改將不會被其餘表明同一數據庫行的領域實例看到,這可能會致使數據庫損壞。 對象

  數據庫獨立性,容許使用一個共同的API和領域模型操做各類數據庫而不改變數據庫的應用程序視圖。

  最先用於訪問關係數據庫的技術(如今仍然很是流行),使用許多API傳輸SQL語句到服務器,並把執行語句的結果返回給應用程序。這會留給應用程序來決定,是直接使用結果仍是建立數據結構來表示查詢的結果,並複製查詢結果給這些數據結構。

  直接模式化的查詢結果所用的的數據結構,沒法模型化數據庫中存在的關係;所以,實例之間的關聯沒有被數據結構充分描述。使用這種類型訪問的例子包括ODBC(開放數據庫鏈接)接口和JDBC(Java數據庫鏈接)接口。這些接口容許有限的關注分離,但更多狀況下是業務邏輯與數據庫編程混合在一塊兒。他們不支持信息隱藏,繼承,變化檢測,惟一性保持或數據庫獨立性。

  更強大的技術是在其接口中提供一些方法將查詢結果複製到用戶指定的數據結構。用戶提供全部註釋過的SQL語句,使它們能夠對應數據結構。用戶建立的SQL語句包括全部的查詢,加上插入,更新和刪除。這些技術處理不少容易出錯和耗費時間的工做以分析查詢結果,但仍然給用戶留下許多艱鉅的任務。以這種風格訪問的一個例子是iBATIS,它支持信息隱藏和有限的關注分離,但不支持繼承,變化檢測,惟一性保持或數據庫獨立性。

  使用O/RM,存儲在關係數據庫中的數據將做爲本地對象編程語言中的對象表示給應用程序。程序員映射領域對象模型類到關係表,並使用一個由持久性提供程序實現了的API來訪問數據庫。對數據庫的查詢表達爲領域對象模型的方式。提供程序直接從領域模型生成SQL語句。馬丁·福勒稱這種方法DataMapper.2

  O/RM技術和產品在許多面向對象的語言中可用,包括Java,C++,C#,Python,Smalltalk,Ruby和Groovy。O/RM所用的技術和編程範式適用於許多支持這些語言的產品。(在這篇文章中,例子使用Java)

相關文章
相關標籤/搜索