オブジェクトデータベースで多対多の関係を設計するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/1069187

質問

OOデータベースを検討する時期が来たと思い、次の小さなプロジェクトである小さなライブラリにdb4oを使用することにしました。

次のオブジェクトを検討してください:本、カテゴリ。

本は0-nのカテゴリに分類でき、カテゴリは0-mの本に適用できます。

最初に考えたのは、BookCatecoryなどの結合オブジェクトを用意することですが、少しグーグルすると、これは「RealOO」には適していないことがわかりました。

したがって、別のアプローチ(多くの人が推奨)は、Book.categoriesとCategory.booksの両方のオブジェクトにリストを含めることです。一方は関係を処理します。Book.addCategoryはCategoryをBook.categoriesに追加し、BookをCategory.booksに追加します。1回のメソッド呼び出しで2つのオブジェクトが変更された場合に、コミットとロールバックを処理するにはどうすればよいですか?

あなたはどう思いますか?2番目のアプローチには明らかな利点がありますが、少なくとも私にとっては、最初のアプローチは正しいと感じます(より適切に標準化されています)。

役に立ちましたか?

解決

オブジェクトデータベースを使用する場合、リレーションがデータベースにどのように格納されるかを気にする必要はありません。クラスとそれらの間の関係を定義します。データベースにガイドされているリファレンスをお読みください。関係の例: ジェネラコディセタグプレ

他のヒント

この問題を解決するために私が考えることができる方法は実際には2つしかありませんが、どちらもおっしゃっています。個人的には、最初のアプローチ(OOエンティティとしてマッピングオブジェクトを作成する)を使用します。これにより、冗長な情報を保持したり、同期したりする必要がなくなります。また、協会が独自のフィールド(たとえば、本がそのカテゴリに割り当てられた日付)を持つことになった場合、それらを簡単に組み込むことができることも意味します。このアプローチは、システム内のさまざまな関連付けに使用されます。 Pik OOエンティティは次のようになります。 ジェネラコディセタグプレ らかここでは、リレーションオブジェクトと2つのコレクションの同期を維持する必要があります。ただし、この場合、コレクションはオプションです。通常、次のようなORMクエリで同じ情報を取得できます。 BookCategory bからb.bookを選択します。ここでb.category= MyCategory 隔代替方法は、次のような設定を行うことです。 ジェネラコディセタグプレ Within ORM / DBツールが自動的にアソシエーションを維持する場合、これは問題ありません。そうしないと、両方のコレクションの更新に行き詰まります。 (Hibernateでは、片側に次のプロパティがあります:マッピングでinverse= true。この側は更新されないため、厳密に言えば、維持する必要はありません。ただし、これは悪い習慣のように思えます。)> ?通常、リレーションにアクセスするのが一方向のみの場合(たとえば、カテゴリ内のすべての本を取得する場合)、反対側のコレクションを削除できます。次に、他の方向から関係にアクセスするには、ORMツールを回避し、ネイティブクエリを使用する必要があると思います。 ●私たちのプロジェクトでHibernate(Javaベースのオブジェクトリレーショナルマッピングツール)を使用しています。 Hibernateのドキュメントは、OO /リレーショナル設計の問題の優れたリファレンスですが、Hibernateを役立つようにするには、少し時間をかけて学習する必要があるかもしれません。 http://docs.jboss.org/hibernate/安定した/コア/リファレンス/ en / html_single /#collections-ofvalues pas HTH!

あなたはリレーショナルデータベースの考え方に少しばかり夢中になっていると思います。各オブジェクトのリストは、OOで行うべき正しいことです。コミットとロールバックは問題ありません。すべてをコミットするか、すべてをロールバックするトランザクションで発生します。

GemStoneなどの純粋なオブジェクト指向データベースでは、オブジェクト自体に他のオブジェクトへの参照のコレクションがあります。オブジェクトがアプリケーションから参照されると、OODBMSはオブジェクトをラップするプロキシを生成します。このためのスキーマは、永続化されたオブジェクトと、それが参照するオブジェクトへの参照のコレクションです。OODBMSは必ずしもリンクエンティティを必要としません。

O / Rマッピングレイヤーを使用すると(M:M関係を実行するのに十分賢い場合)、M:M関係は、O / Rマッパーがリンクに解決するオブジェクト自体の補助参照のコレクションとして表されます。舞台裏の実体。すべてのO / Rマッパーがこれを行うわけではないため、個別のリンクオブジェクトがある場合があります。

ODBMSを使用したい特別な理由はありますか?単純なデータ構造(本の分類など)の場合、通常、ODBMSはRDBMSよりも優れているとは言えず、実際、はるかに標準化されたRDBMSの世界で作業する方が簡単です。ODBMSには、複雑なデータ型や動的オブジェクトのリテラルの永続性/ストレージを操作する場合に、非常に具体的な利点があります。ODBMSは、RDBMSよりもはるかに高速でスケーラブルであるとも言われていますが、私自身はこれについてほとんど洞察を提供できません。ただし、RDBMSとODBMSについて説明しているページがいくつかあります。

オブジェクト指向データベースに何が起こったのか

オブジェクト指向データベースとオブジェクトリレーショナルデータベース(SO)

データの重複を避けるのは、違いをマージする際にあらゆる種類の問題が発生するためです。

これに対する秘訣は参照です。

その結果、各オブジェクトに他のオブジェクトタイプへの参照のコレクションが含まれ、他のオブジェクトの独立したコレクションが含まれるようになります。

マッチングテーブルは、その中間接続クラスがどちらのオブジェクトにも起因しないプロパティを持っている場合を除いて、リレーショナル概念です。リレーションを21対多のリレーションに減らし、データの重複を大幅に減らすため、クエリを強力な方法で記述できるようになります。一致するテーブルのないリレーションデータベースでこれを行った場合、事態はすぐに悪になります-更新はどのように機能しますか?個人的には、ooデータベースの魅力はこれから離れていると思います

すべてのオブジェクトを結び付ける方法は、コード内のイベントを介して、オブジェクトの状態をキャッシュできるようにするためのある種のトランザクションハンドラーです。そのため、オブジェクトが相互にプロパティを操作するのではなく、ハンドラーを介して変更を要求し、コールバックで結果を待ちます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top