2009-07-01 17 views
14

私は、OOデータベースを見るのは時間切れだと思って、次の小さなプロジェクト、つまり小さなライブラリにdb4oを使うことに決めました。書籍、カテゴリー:オブジェクトデータベースで多対多の関係を設計するにはどうすればよいですか?

は、次のオブジェクトを考えてみましょう。

ブックは0 nカテゴリにあり、カテゴリは0 mブックに適用できます。

私の最初の考えは、BookCatecoryのような結合オブジェクトを持っていることですが、ある程度のGoogle検索の後、これは「Real OO」には適していないことがわかります。

もう1つのアプローチ(多くの人に推薦される)は、両方のオブジェクトにリストを持たせることです:Book.categoriesとCategory.books。片側が関係を処理する:Book.addCategoryはCategoryをBook.categoriesに追加し、BookはCategory.booksに追加します。 1つのメソッド呼び出しで2つのオブジェクトが変更された場合のコミットとロールバックの処理方法

あなたの考えは? 2番目のアプローチには明白な利点がありますが、少なくとも私にとっては、最初の「感じる」権利(より良い規範)があります。

答えて

5

オブジェクトデータベースを使用する場合、リレーションシップをデータベースに格納する方法に注意する必要はありません。クラスとクラス間の関係を定義します。あなたのデータベースに案内された参照を読んでください。関係の例:

1

私はあなたがほんの少しの思考のリレーショナルDB途中でハングアップだと思います。各オブジェクトのリストは、実行するための適切なオブジェクトです。コミットとロールバックは問題ありません。すべてをコミットしたり、すべてをロールバックするトランザクションで発生します。

1

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

O/Rマッピングレイヤー(M:M関係を実行するのに十分巧妙であると仮定します)では、M:M関係はO/Rマッパーが解決するオブジェクト自体の補助参照のコレクションとして表されます。リンクエンティティの背後にある。すべてのO/Rマッパーがこれを行うわけではないので、別のリンクオブジェクトを持つかもしれません。

1

ODBMSを使用する特別な理由はありますか?単純なデータ構造(ブックの分類など)では、RDBMSと比較してODBMSの利点はほとんどありません。標準化されたRDBMSの世界では、実際には簡単に作業できます。 ODBMSは、複雑なデータ型や動的オブジェクトのリテラルの永続性/記憶域を扱う場合には、非常に目に見える利点があります。 ODBMSはRDBMSよりもはるかに高速でスケーラブルであるとも言われていますが、私はこのことについて少し洞察を提供することができます。ここでODBMS対RDBMSを議論するカップルのページは、しかし、以下のとおりです。

Whatever Happened to Object-Oriented Databases

Object-Oriented Database vs. Object-Rleational Database (SO)

+0

私は、dbschemaの作成、テーブルの作成、オブジェクトの作成、オブジェクトへのテーブルのマッピングなどを避けることができたかどうかを確認したいと考えていました.Odbmsがロバの作業をたくさん切ってしまうようです... – paul

+0

その仕事のいくつかを切り捨てるが、まともなORM層もそうだ。私は、ODBMSが間違った選択であると言っているわけではありませんが、あなたにもより良いサービスを提供する選択肢があります。 –

0

、あなたは違いをマージしてあらゆる種類の問題に実行するので、私は、データの重複を避けるだろう。これに

トリックが参照されます。

結果は、私は、各オブジェクトが他のオブジェクトから独立してコレクションを有するだけでなく、他のオブジェクト・タイプへの参照のコレクションを含んでいなければならないことです。

マッチングテーブルは、いずれかのオブジェクトに起因しないプロパティを持つ中間接続クラスでない限り、リレーショナルコンセプトです。クエリが強力な方法で書かれることを可能にするので、1対多の関係への関係が減少し、データの重複が大幅に減少します。マッチングテーブルがないリレーションデータベースでこれを実行した場合、非常に早急に悪化します。アップデートはどのように動作しますか?個人的に私はooデータベースの魅力を離れてこれから踏み出すことを見つける

私はすべてのオブジェクトを一緒に結びつける方法は、オブジェクトの状態のキャッシュを可能にするトランザクションハンドラの種類のイベントのコードです。他のプロパティを操作するオブジェクトではなく、ハンドラを介して変更を要求し、結果をコールバックで待機します。

8

私がこの問題を解決するために考えることができるのは、実際には2つの方法しかありません。個人的には、最初のアプローチ(OOエンティティとしてのマッピングオブジェクトの作成)に行きます。これにより、冗長な情報を保持したり、同期する必要がなくなります。それは、協会が独自のフィールド(書籍がそのカテゴリに割り当てられた日付、言いましょう)がある場合、それらを簡単に組み込むことができるということも意味します。私たちは、このアプローチを、私たちのシステムのさまざまな関連付けに使用します。あなたが同期して関係オブジェクトと2つのコレクションを維持する必要があります。ここ

BookCategory { 
Book book 
Category category 
} 
Book { 
Collection <BookCategory> categories 
} 
Category { 
Collection <BookCategory> categories 
} 

;:

OOエンティティは次のようになります。ただし、コレクションはこの場合はオプションです。通常は、ORMのクエリと同じ情報を得ることができ、何かのように:

Book { 
Collection<Category> categories 
} 

Category { 
Collection<Books> books 
} 

の場合:b.category = MyCategory

代替のような設定を持つことであるBookCategory Bから 選択b.book ORM/DBツールが自動的に関連付けを維持しますが、これは問題ありません。そうしないと、両方のコレクションを更新していません。 (Hibernateでは、一方の側にプロパティがあります:inverse = true、マッピングではこの側は更新されていませんので、厳密にはメンテナンスする必要はありません)。

通常、リレーションシップにのみアクセスする場合(たとえば、カテゴリ内のすべての書籍を取得する場合)、他の側のコレクションを削除することができます。 ORMツールを回避してネイティブクエリを使用して、他の方向からリレーションシップにアクセスする必要があると思います。

プロジェクトでは、Hibernate(Javaベースのオブジェクトリレーショナルマッピングツール)を使用します。あなたがそれらを有用にするために休止状態を学習少し時間を費やす必要がありかかわらず、Hibernateのドキュメントは、オブジェクト指向/リレーショナル設計上の問題のために良いの参照です: http://docs.jboss.org/hibernate/stable/core/reference/en/html_single/#collections-ofvalues

HTH!

+0

私はdb40に慣れていないことを言及する必要があります。この回答は一般的にあなたが記述しているORMの問題に適用されます、私は=) – RMorrisey

+0

+1応答と休止状態のヒント – paul

関連する問題