15

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

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

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

私の最初の考えはBookCatecoryのような結合オブジェクトを持つことですが、少しグーグルした後、これは「RealOO」には適切ではないことがわかりました。

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

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

4

6 に答える 6

9

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

OO エンティティは次のようになります。

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

ここでは、関係オブジェクトと 2 つのコレクションの同期を維持する必要があります。ただし、この場合、コレクションはオプションです。通常、次のような ORM クエリを使用して同じ情報を取得できます。 select b.book from BookCategory b where b.category = MyCategory

別の方法は、次のようなセットアップを行うことです。

Book {
 Collection<Category> categories
}

Category {
 Collection<Books> books
}

ORM/DB ツールが関連付けを自動的に維持する場合、これで問題ありません。そうしないと、両方のコレクションを更新できなくなります。(Hibernate では、マッピングで一方の側にプロパティ: inverse=true があります。この側は更新されないため、厳密に言えば維持する必要はありません。ただし、これは悪い習慣のように思えます。)

通常、関係に 1 つの方法でのみアクセスする場合 (たとえば、カテゴリ内のすべての本を取得するなど)、反対側のコレクションを削除できます。次に、ORM ツールを回避し、ネイティブ クエリを使用して、別の方向から関係にアクセスする必要があると思います。

プロジェクトでは Hibernate (Java ベースのオブジェクト リレーショナル マッピング ツール) を使用します。Hibernate のドキュメントは、オブジェクト指向/リレーショナル設計の問題の良いリファレンスですが、Hibernate の学習に少し時間を費やす必要があるかもしれません: http://docs.jboss.org/hibernate/stable/core/reference/en/ html_single/#collections-ofvalues

チッ!

于 2009-09-02T19:40:17.560 に答える
1

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

于 2009-07-01T13:50:01.113 に答える
0

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

これの秘訣は参照です。

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

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

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

于 2009-07-01T14:04:58.307 に答える