5

練習のために、私は次のようなものを構築する必要があります:

コースでは、特定のレビューラインとフィードバックスコアで構成されるレビューを作成する必要があります。

このレビュー オブジェクト (一意のインスタンス) には、顧客のリストを入力する必要があります。

レビュー対象のコースに応じて、レビューは変わります (たとえば、あるコースでは、レビューラインとフィードバックスコアの数が変わります)。各顧客は複数のコースに登録でき、各レビューは顧客固有のものです。

ここに画像の説明を入力

JPAを使用してこれをすべてデータベースに保存したい場合、「レビュー」オブジェクト(一意のインスタンス)と「顧客」の間の関係をどのように確認する必要がありますか?

  • 顧客は、記入が必要なレビューを複数持つことができます。
  • 特定のレビュー オブジェクトは、多くの顧客によって記入される必要があり (ただし、これは特定のビルド [レビューラインとフィードバックスコア] を持つレビュー オブジェクトです)、その顧客にとって一意です。

複雑に見えるかもしれませんが、これを構築する最良の方法は何ですか?

4

3 に答える 3

1

データの構造は常に要件に依存し、「唯一無二」のソリューションは存在しません。では、最大化された原子性または高性能データ システムが必要ですか?

最速かつ最も簡単なソリューションは、データベースではなくハッシュ テーブルを使用することです。あなたの場合、顧客、レビュー用に 3 つのハッシュ テーブル、おそらく n:n 関係用にもう 1 つのハッシュ テーブルを作成できます。または、データベースを使用している場合は、customer テーブルの 1 つのフィールドに review-primary-keys の配列を格納するだけです。

ただし、私たちは皆、学校で原子性を行うことを学ぶので、それを行いましょう (主キー/外部キーを書くだけです!):

  • 顧客 (unique_ID, ...)
  • レビュー (unique_ID, ...)
  • Customer_Review (customer_ID、review_ID、...) --> n:n-関係

Customer_Review は、顧客とレビューの間の n:n 関係を表します。しかし、可能なレビューごとに 1 人の顧客しかいない場合は、次のようにします。

  • 顧客 (unique_ID, ...)
  • レビュー (pk: unique_ID、fk: customer_ID、...) --> 1:n-関係

ただし、良い出発点として ERM を学ぶ必要があることをお勧めします: http://en.wikipedia.org/wiki/Entity_relationship_model

于 2013-02-14T11:02:54.833 に答える
1

次のことを試してください。

ER/クラス図

私はそれがあなたのすべての設計ポイントをカバーしていると思います。

私はあなたのコメントの行間を読み込もうとしていますが、あなたはいくつかの「ルール」を取得するシステムを実装したいと考えていますReview(私は推測していますが、例として、レビューは最大n行になる可能性があります)。 、ある程度の品質を得る前に、少なくともmが必要です)。 これが実際に当てはまる場合、クラスを作成しました:CustomerReviewsReviewReviewTemplate

  • ReviewTemplate必要な値ごとに属性/列があります。これらの属性/列は複製されていますReview
  • いくつReviewTemplateかの行を入力してから、行を作成しCourseて 1 つにリンクしますReviewTemplate
  • Courseが を必要とする場合、フィールドを からReviewコピーReviewTemplateします。Review
  • Java では、上の値ではなく、コピーされた値Reviewを使用するためのビジネス ルールを実装します。ReviewTemplate

値をコピーする理由 ユーザーがテーブルを編集したくなる時が来ると思いReviewTemplateます。もしそうならReview、編集された を使用しているオブジェクトはどうなりますReviewTemplatesか? 変更された値はReviewTemplate何らかの形で過去を無効にReviewsし、ビジネス ロジックを壊しますか? いいえ、ルール値を にコピーしたReviewため、過去Reviewsは変更されません。

編集:特定の質問への回答

複製をどのように見ていますか?指定された属性を持つエンティティ ReviewTemplate を作成できます。このエンティティには、reviewlines および feedbackscores との関係があります。

私は、それぞれReviewTemplateが の特定の「タイプ」のプロトタイプ値を保持してReviewいると考えています。これには、デフォルトの reviewLine (意味がないかもしれません) とデフォルトの feedbackScore が含まれている可能性があります。を作成するときReviewは、次のことを行います。

  1. をインスタンス化し、Review値を入力しますReviewTemplate
  2. CustomerReview必要な数のオブジェクトをインスタンス化し、それらを関連するCustomerオブジェクトにリンクします (この手順は、以前のコメントから推測します。ユーザーがCustomer自発的にレビューすることを選択するまで、この手順を省略することも理にかなっていますCourse) 。

    1. (該当する場合)からのデフォルト値をCustomerReview属性に入力します。feedbackScoreReviewTemplate
    2. CustomerReviewLine必要に応じてレコードをインスタンス化する

このアプローチに従えば、 と の間に関係を追加する必要はありませReviewTemplateCustomerReviewLines

たとえば、顧客 1 ~ 4 がレビューに記入する必要があると述べた場合、情報を保持する 4 つの特定の「オブジェクト」を作成する必要があり、必要なレビューラインとフィードバックスコアの 4 つのセットを作成して、すべての顧客が情報を保持できるようにする必要があります。 .

絶対。

これを実装する方法がわからないのはJPA構造であるため、情報はデータベースに保持されます...?

JPA ではさまざまな方法で問題に対処できますが、ベスト プラクティスは、DB スキーマと Java クラスの両方を手動で作成することです (例: https://stackoverflow.com/a/2585763/1395668を参照)。したがって、図のエンティティごとに、次のことを行う必要があります。

  1. SQL DDL ステートメントを記述して、テーブル、列、主キー、および外部キーを作成します。
  2. @entityアノテーションで示される Java クラスを記述します。クラス内では、id (主キー) に注釈を付け、or@idとの関係にも注釈を付ける必要があります(同様に設定する注釈の追加パラメーター)。@OneToMany@ManyToOne

JPA 側では、次のようなことができます。

ReviewTemplate template = course.getReviewTemplate(); //assuming the variable course
Review review = new Review();
review.setCourse(course);
review.setRuleOne(template.getRuleOne());
// Copy other properties here

EntityManager em = // get the entity manager here
em.persist(review);

// Assume a set or list of customers
for (Customer customer : customers) {
    CustomerReview cr = new CustomerReview();
    cr.setReview(review);
    cr.setCustomer(customer); 
    cr.setFeedbackScore(template.getDefaultFeedbackScore());
    // set other CustomerReview properties here

    em.persist(cr);

    // You can create CustomerReviewLine here as well

標準の EJB セッション Bean 内に記述した場合、これはすべて適切に処理され、すべての新しいレコードが DB にコミットされます。

編集 2: 追加の質問

(私は、2 番目のコメントが最初のコメントに完全に取って代わると仮定しています)

そのため、reviewtemplate を作成して多数の顧客にリンクするときは、テンプレートをデータベースに書き込み、テンプレートに基づいて多数のレビューを作成しますが、特定の顧客にリンクし、独自のレビューラインとフィードバックスコアを使用します。私が今見ているように、レビューライン(より質問または説明)は(テンプレートの)各レビューで同じです。顧客間で変化するのはスコアのみです

やっとわかった気がするReviewLineCustomerを構成するテキスト行を入力する場所だと思っていましたCustomerReview。私は今、それReviewLineが特定の質問でありCustomerCustomerフィードバックスコアを提供すると信じています。

この理解に基づいて、更新された ER/クラス図を次に示します。

ここに画像の説明を入力

いくつかの重要な変更があることに注意してください - さらにいくつかの表があります:

  1. ReviewLineTemplateテンプレートの質問をReviewTemplate
  2. Reviewインスタンス化/挿入されると (これは特定の のコピーですReviewTemplate)、 はReviewLineTemplatesとしてコピーされReviewLinesます。コピー操作では、次の 2 つの重要な機能が使用できます。

    1. 作成時に、またはに影響を与えずにReviewとそのReviewLinesをカスタマイズできます。ReviewTemplateReviewLineTemplate
    2. 時間が経つにつれて、ReviewTemplate既に回答した質問を変更することなくReviewLineTemplate、 を更新、編集し、継続的に改善することができます。が直接リンクされている場合、 を編集すると、 が回答した質問が変更され、feedbackScore が黙って無効になります。CustomerCustomerFeedbackScoreReviewLineTemplateReviewLineTemplateCustomer
  3. ReviewLineFeedbackScore はとの間の結合テーブルに移動されましたCustomerReview

このモデルは完全に非正規化されているため、より「正確」になりますが、GUI の構築が難しくなります。一般的な「最適化」は、以下を導入することです。

  • の 10 (たとえば) 列でReviewTemplate、を介してReview呼び出されます。reviewLine1reviewLine10
  • を介してCustomerReview呼び出される10 (たとえば) 列。feedbackScore1feedbackScore10
  • ReviewTemplateLineReviewLineおよびCustomerReviewLineテーブルを削除します

そうすることは正規化されておらず、他の一連の問題を引き起こす可能性があります。YMMV

于 2013-02-14T02:44:59.680 に答える
0

ManyToMany リレーションが必要です:

  • 1 人の顧客 -> 複数のレビュー。
  • 1 件のレビュー -> 複数の顧客。

したがって、データベース スキーマには、顧客、レビュー、および顧客 ID とレビュー ID を持つジャンクション テーブルの 3 つのテーブルがあります。

ウィキペディアを参照してください:多対多

于 2013-02-11T23:20:20.867 に答える