3

私はRubyとRailsは初めてですが、Oracleのフロントエンドの構築にはしばらく携わっています。私はオブジェクト指向設計 (OOD) も初めてなので、ここでもいくつかの重要な詳細を見逃している可能性があります。いずれにせよ、私は Ruby と Oracle (そう、Oracle に違いない) を使ってゼロから新製品を構築する機会を与えられました。Ruby の完全な OO の性質を考えると、OO データ モデル (または、Oracle の場合はオブジェクト リレーショナル モデル) も構築しようとするのは理にかなっていると思いました。しかし、Rails と Oracle Objects の両方を調査したところ、解決策を見つける代わりに、当惑させるパラドックスが見つかりました。ですから、私の基本的な質問は次のとおりです。

詳細

私が現在見ている基本的な問題は、Rails の ActiveRecord モジュールが Oracle オブジェクトと互換性がないことです。つまり、Oracle のオブジェクト型などの複雑なデータ型をサポートしていないためです (または、サポートしている場合でも、その方法を説明するドキュメントをまだ見つけていません)。したがって、ActiveRecord は、オブジェクトやオブジェクト参照のコレクションを含む Oracle テーブルを簡単に操作できません。要するに、Rails はデータベースにとらわれず、Oracle Objects はアプリケーションにとらわれず、これら 2 つの哲学は現在対立していることが証明されています。

ポイントを示す例

私がやりたいことは、アプリとデータベースの両方で同じオブジェクト定義を使用して、オブジェクト リレーショナル マッピングを削減または排除することです。ただし、Rails には Oracle でオブジェクト型を作成または読み取る機能がないように思われるため、Oracle でオブジェクト リレーショナル モデルを作成し、代わりにリレーショナル モデルを作成する努力をする価値はありません。これにより、Rails アプリの OO モデルが大幅に削減されるという副作用が生じます。これはパラドックスです。Rails の機能は、データの永続性のためにリレーショナル データ モデルを強制することによって、Rails 自体の OOP 機能を本質的に低下させます。

たとえば、さまざまなタイプのウィジェットが多数あるとします。Oracle Objects でこれをサポートするために、ウィジェット オブジェクト タイプとさまざまなウィジェット サブタイプを作成する場合があります。次に、ガジェットを構成するさまざまなウィジェット タイプとサブタイプへのウィジェット参照のコレクションを含む属性を持つガジェット オブジェクトを作成します。このオブジェクト モデルは私にはシンプルでエレガントに思えますが、Ruby でもうまく機能するはずです。しかし、Rails と ActiveRecord を方程式に入れると、突然、ガジェット テーブルとウィジェット テーブル (1 つのテーブルでさまざまなウィジェット タイプをサポートするためのウィジェット タイプの列とその他のさまざまな列を含む) を持つリレーショナル テーブルにモデルをフラット化していることに気付きます。 ) と、ウィジェットをガジェットにアタッチするための 2 つの間の 1:N テーブル。その結果、Rails の私のオブジェクトは、ウィジェット オブジェクト タイプが 1 つだけで、ウィジェット オブジェクトのサブタイプがない (ウィジェット オブジェクトには、タイプを示す属性があるだけです) これらのテーブルと非常によく似た外観になります。テーブルに一致しないオブジェクト モデルを Rails で構築しようとするのは、クエリに関する犯罪と罰の未来のように思えます。この OOD からの強制的な逸脱は、私にとって悲劇に感じます。確かに、テーブルを完全に正規化し、さまざまなウィジェット サブタイプ テーブルを作成しようとする別のアプローチもあるかもしれませんが、このアプローチはリレーショナルの世界では (継承がないため) 常に意味があるとは限りません。現行の企画。テーブルに一致しないオブジェクト モデルを Rails で構築しようとするのは、クエリに関する犯罪と罰の未来のように思えます。この OOD からの強制的な逸脱は、私にとって悲劇に感じます。確かに、テーブルを完全に正規化し、さまざまなウィジェット サブタイプ テーブルを作成しようとする別のアプローチもあるかもしれませんが、このアプローチはリレーショナルの世界では (継承がないため) 常に意味があるとは限りません。現行の企画。テーブルに一致しないオブジェクト モデルを Rails で構築しようとするのは、クエリに関する犯罪と罰の未来のように思えます。この OOD からの強制的な逸脱は、私にとって悲劇に感じます。確かに、テーブルを完全に正規化し、さまざまなウィジェット サブタイプ テーブルを作成しようとする別のアプローチもあるかもしれませんが、このアプローチはリレーショナルの世界では (継承がないため) 常に意味があるとは限りません。現行の企画。

Rails はさておき、純粋に Ruby に焦点を当てると、OCI8 インターフェースは Oracle のオブジェクト タイプを処理できるように見えますただし、これを使用する方法に関するサポート ドキュメントは見つかりませんでした。これは、ここで私自身の道を切り開くためにRailsをダンプするコストが高すぎることをかなり明白にしています(多くの人がOracleオブジェクト自体が使いにくいと感じる追加のコストがかかります)。このような小さなプロジェクトでは、リレーショナル Oracle で Rails を使用する方がはるかに簡単です。

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 に答える