2012-11-28 41 views
3

我是Ruby和Rails的新手,但是已經花了一段時間來構建Oracle的前端。我也是面向對象設計(OOD)的新手,所以我可能在這裏錯過了一些重要的細節。無論如何,我有機會從Ruby和Oracle開始構建新產品(是的,它必須是Oracle)。鑑於Ruby的OO本質,我認爲嘗試構建OO數據模型也是有意義的(對於Oracle來說,也是一種對象關係模型)。然而,在我對Rails和Oracle Objects的研究中,我發現了一個令人不安的悖論,而不是尋找解決方案。所以,我的基本問題是:我錯過了什麼?Ruby on Rails與Oracle對象(以及一般的面向對象的數據持久性)

更多詳細信息

的基本問題,我目前看到的是,Rails的ActiveRecord模塊不兼容Oracle對象即是因爲它不支持複雜數據類型,如Oracle的對象類型(或者,如果它不,我還沒有找到描述如何的文檔)。因此,ActiveRecord不能輕鬆處理包含對象和/或對象引用集合的Oracle表。簡而言之,Rails想要成爲數據庫不可知論者,Oracle Objects希望成爲應用程序不可知論者,而這兩種哲學目前證明存在衝突。

爲例來說明點

我想要做的就是使用相同的對象定義的應用程序,以減少或消除對象關係映射數據庫兩者。但是,因爲看起來Rails沒有在Oracle中創建或讀取對象類型的功能,所以它不值得在Oracle中創建對象關係模型,而是創建一個關係模型。反過來,這將會大大減少Rails應用程序中的OO模型的副作用。這就是矛盾 - Rails的特性通過強制關係數據模型實現數據持久性,從而降低了它自己的OOP功能。

例如,假設我有許多不同類型的小部件。爲了在Oracle對象中支持這一點,我可能會創建一個窗口小部件對象類型和各種窗口小部件子類型。然後,我可能會創建一個小工具對象,其中包含一個屬性,該屬性包含構成小工具的各種小部件類型和子類型的小部件引用集合。這個對象模型對我來說聽起來簡單而優雅,並且在Ruby中也應該很好地工作。然而,將Rails和ActiveRecord放入等式中,我突然發現自己將模型平鋪到關係表中,其中有一個小工具表和一個小工具表(帶有小工具類型列和各種其他列以支持一個表中的各種小工具類型)和兩者之間的1:N表格,用於將小部件附加到小工具。因此,Rails中的對象最終會看起來與這些表格非常相似,只有一個小部件對象類型和沒有小部件對象子類型(小部件對象只具有指示類型的屬性)。嘗試在Rails中構建不匹配表的對象模型聽起來像是查詢犯罪和懲罰的未來。這種被迫離開OOD的感覺對我來說是悲慘的。當然,另一種方法可能是嘗試完全標準化表格並創建各種小部件子類型表,但這種方法在關係世界中並不總是很有意義(由於缺乏繼承),並會導致我的主要表連接頭痛當前的項目。

把Rails放在一邊,只關注Ruby,它確實看起來OCI8接口能夠與Oracle對象類型一起工作。但是,我還沒有找到任何有關如何使用這些文件的支持文檔。這很明顯的表明,傾銷Rails在這裏開闢我自己的足跡的代價會太高(因爲許多人認爲Oracle Objects本身使用起來太笨拙)。使用Rails和關係型Oracle來處理像這樣的小型項目要簡單得多。當我試圖想象通過ActiveRecord或類似模塊支持對象數據類型所涉及的複雜性時,可以理解爲什麼此功能尚未構建(特別是考慮到Rails的數據庫不可知論哲學)。可以理解......但不幸。

所以。我錯過了什麼?從Ruby和/或Rails支持Oracle對象的方式是否影響小,支持良好?如果不是Oracle,Rails是否可以爲任何對象關係數據庫管理系統提供良好的對象類型支持?

+0

附註:我在發佈後不久發現了DataMapper.org,雖然DataMapper看起來像_might_提供了一個支持對象數據類型的較短路徑,但它的目標是遺留數據類型,並沒有提及對象類型的用法。如果沒有特定的對象類型支持(或文檔),我現在不得不跳過這個映射器,並且可能在我更瞭解Ruby之後再回來。 – juanitogan

回答

3

Rails在設計上對於應該如何工作有非常強烈的「意見」。

在ActiveRecord的情況下:它提供了一個簡單的API來處理傳統的關係數據庫,因爲這是Web應用程序通常需要的。它確實將這個數據庫視爲簡單類型的啞數據庫,並定義了Ruby方面的所有關係和邏輯。

支持其他技術,如對象數據庫,會使正常用例更復雜,所以ActiveRecord不會。

Rails社區支持NoSQL(文檔和鍵值)存儲,但我還沒有看到任何對象數據庫。

也就是說,Rails 3已經將ActiveRecord的許多功能轉移到單獨的模塊中。您可以使用這些來推出自己的Oracle Object存儲層。但是,我想在大多數情況下,這種努力會超過收益。另外,如果您的特殊問題是您需要子類型,請查看Rails的「單表繼承」功能,該功能允許您擁有單個數據庫表,其中每行都有其自己的ActiveRecord類型。

所以,你不會特別錯過任何東西。如果你喜歡Rails,我會建議嘗試使用現有的生態系統。如果你真的認爲你需要一個對象數據庫,也許你最好試着找到一個已經支持這個支持的框架。

+0

謝謝你的回答。我並不認爲自己錯過了很多,但是想把它給人羣確定。我目前的項目相當小,所以我沒有計劃或需要在ActiveRecord功能之外使用此項目。 ---我猜這裏的另一個消息可能更具哲理性,可能會讓社區稍稍偏向於顯示當前生態系統在OOD方面的前景。雖然,我不能說這是錯誤的。簡單很好。 ---你的回答非常好,在這點上我可能會讓這個人坐在我選擇這個答案之前。 – juanitogan