3

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

更多细节

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

论证要点的例子

我想做的是在应用程序和数据库中使用相同的对象定义来减少或消除对象关系映射。然而,因为 Rails 似乎没有在 Oracle 中创建或读取对象类型的功能,所以在 Oracle 中创建对象关系模型并改为创建关系模型是不值得的。反过来,这将产生极大地减少 Rails 应用程序中的 OO 模型的副作用。这就是悖论——Rails 的特性通过强制使用关系数据模型来实现数据持久性,从而固有地降低了它自己的 OOP 能力。

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

将 Rails 放在一边,只专注于 Ruby, OCI8 接口似乎确实能够处理 Oracle 对象类型。但是,我还没有找到任何关于如何使用它的支持文档。这很明显,放弃 Rails 以开辟自己的道路的成本太高了(许多人发现 Oracle 对象本身使用起来很笨拙)。对于像这样的小项目,将 Rails 与关系 Oracle 一起使用要简单得多。

当我试图想象尝试通过 ActiveRecord 或类似模块支持对象数据类型所涉及的复杂性时,可以理解为什么尚未构建此功能(特别是考虑到 Rails 的与数据库无关的哲学)。可以理解……但很不幸。

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

4

1 回答 1

3

Rails 在设计上对事情应该如何工作有非常强烈的“意见”。

以 ActiveRecord 为例:它提供了一个简单的 API 来处理传统的关系数据库,因为这是 Web 应用程序通常需要的。它确实将该数据库视为简单类型的哑存储,并在 ruby​​ 端定义所有关系和逻辑。

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

Rails 社区支持 NoSQL(文档和键值)存储,但我还没有看到任何对象数据库。

也就是说,Rails 3 已将大部分 ActiveRecord 功能转移到单独的模块中。您可以使用它们来推出您自己的 Oracle 对象存储层。但是,我想在大多数情况下,付出的努力会超过好处。

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

所以,你没有特别错过任何东西。如果您喜欢 Rails,我建议您尝试使用现有的生态系统。如果你真的认为你需要一个对象数据库,也许你最好尝试找到一个已经支持该支持的框架。

于 2012-12-03T23:36:24.963 回答