ruby-on-rails - Ruby on Rails与Oracle Objects(以及一般面向对象的数据持久性)

标签 ruby-on-rails oracle activerecord orm datamapper

我是Ruby和Rails的新手,但已经有一段时间为Oracle建立前端了。我也是面向对象设计(OOD)的新手,所以我可能在这里也错过了一些重要的细节。无论如何,我有机会使用Ruby和Oracle从头开始构建新产品(是的,必须是Oracle)。考虑到Ruby的总体OO性质,我认为尝试构建OO数据模型也是有意义的(对于Oracle,则是对象关系模型)。但是,在我对Rails和Oracle Objects的研究中,没有找到解决方案,而是发现了一个令人不安的悖论。所以,我的基本问题是:我缺少什么吗?

更多细节

我目前看到的基本问题是Rails的ActiveRecord模块与Oracle Objects不兼容,这是因为它不支持复杂的数据类型,例如Oracle的对象类型(或者,如果支持,我还没有找到描述方式的文档)。因此,ActiveRecord无法轻松使用包含对象和/或对象引用集合的Oracle表。简而言之,Rails希望与数据库无关,Oracle Objects希望与应用程序无关,而这两种思想目前已证明存在冲突。

示范要点

我想做的是在应用程序和数据库中使用相同的对象定义,以减少或消除对象关系映射。但是,由于看上去Rails没有在Oracle中创建或读取对象类型的功能,因此在Oracle中创建对象关系模型而不是创建关系模型是不值得的。反过来,这将具有大大减少Rails应用程序中的OO模型的副作用。这是自相矛盾的-Rails的功能通过强制关系数据模型实现数据持久性而固有地降低了其自身的OOP功能。

例如,假设我有许多各种类型的小部件。为了在Oracle Objects中支持此功能,我可能会创建一个小部件对象类型和各种小部件子类型。然后,我可能会创建一个带有属性的小工具对象,该属性包含对构成小工具的各种小工具类型和子类型的小工具引用的集合。这个对象模型对我来说听起来简单而优雅,并且在Ruby中也应该能很好地工作。但是,将Rails和ActiveRecord放到等式中,我突然发现自己将模型放平到关系表中,其中有一个小工具表和一个小部件表(一个小部件类型列和其他各种列,以支持一个表中的各种小部件类型)和两者之间的1:N表,用于将小部件附加到小工具。因此,我在Rails中的对象最终看起来与这些表非常相似,只有一个小部件对象类型而没有小部件对象子类型(小部件对象仅具有一个指示类型的属性)。尝试在Rails中构建与表不匹配的对象模型听起来像查询犯罪和惩罚的未来。对OOD的这种强制偏离让我感到悲惨。当然,另一种方法可能是尝试完全规范化表并创建各种小部件子类型表,但是这种方法在关系世界中并不总是很有意义(由于缺乏继承),并且会引起我的主要表联接麻烦当前的项目。

撇开Rails并只专注于Ruby,似乎OCI8接口能够使用Oracle对象类型。但是,我没有找到有关如何使用它的任何支持文档。这很明显地表明,将Rails丢在我头上的费用实在太高了(很多人发现Oracle Objects本身使用起来很笨拙,这增加了成本)。将Rails与关系Oracle一起用于这样的小型项目要简单得多。

当我试图想象通过ActiveRecord或类似模块来支持对象数据类型所涉及的复杂性时,可以理解为什么尚未构建此功能(尤其是考虑到Rails的数据库不可知性)的原因。可以理解...但是很不幸。

所以。我错过了什么?是否有一种低影响力且得到良好支持的方法来支持来自Ruby和/或Rails的Oracle对象?如果不是Oracle,Rails是否为任何对象关系数据库管理系统提供良好的对象类型支持?

最佳答案

通过设计,Rails对事物的工作方式提出了非常强烈的“意见”。

对于ActiveRecord:它提供了一个简单的API来与传统的关系数据库一起使用,因为这是Web应用程序通常需要的。它确实将数据库视为简单类型的哑存储,并定义了红宝石方面的所有关系和逻辑。

支持其他技术(例如对象数据库)会使正常使用情况变得更加复杂,因此ActiveRecord不会。

Rails社区中对NoSQL(文档和键值)存储提供了支持,但是我还没有看到对象数据库的任何信息。

也就是说,Rails 3已将许多ActiveRecord功能移到了单独的模块中。您可以使用它们来部署自己的Oracle Object存储层。但是,我认为在大多数情况下,付出的努力会超过收益。

另外,如果您的特定问题是需要子类型,请查看Rails的“单表继承”功能,该功能使您可以拥有一个数据库表,其中每一行都有其自己的ActiveRecord类型。

因此,您不会特别错过任何东西。如果您喜欢Rails,建议您尝试使用现有的生态系统。如果您确实认为您需要对象数据库,那么最好尝试找到一个已经包含了该支持的框架。

关于ruby-on-rails - Ruby on Rails与Oracle Objects(以及一般面向对象的数据持久性),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13612975/

相关文章:

ruby-on-rails - 使用通配符对数组列进行 Activerecord 查询

ruby-on-rails - 在 ruby​​ on rails 中查找关联中的所有 nil

ruby-on-rails - Rails .megabytes 方法返回错误值

sql - Oracle 中的部分索引还是完整索引?

sql - Oracle SQL : Is it possible to create a table based on a selection and order by a column?

mysql - 指定两个月之间距离的铁路迁移..?

ruby-on-rails - I18n :Module 的未定义方法 `translate'

ruby-on-rails - NoMethodError:Roo::CSV:Class 未定义方法 `generate'

mysql - Rails - 如何修复/转换不正确的字符串值?

oracle - ORA-00600,参数 : [KGL-heap-size-exceeded]