2009-03-24 9 views
0

私は「投稿」の表を持っており、各投稿の評価を追跡したいと思います。通常、私は実際の評価データを保持する別の "評価"テーブルを参照する同じテーブルにint値を持つ評価フィールドを追加します。その評価フィールドを削除し、postIDに基づいてレーティングテーブルからレーティングを直接呼び出しても問題はありませんか?投稿テーブルはレーティングを直接参照することはありませんが、レーティングテーブルはポストIDを参照します。どちらの方がより良い/正しいですか。 tia関連フィールドをdbテーブルに含める場合とそうでない場合

+0

実際の構造は何ですか?投稿ごとに1つの評価?投稿ごとに複数の評価がありますか?そして評価はどうですか?コメントとスコア、閉じた値のセット、たとえば1〜5つ星「正しい」デザインはそれに依存します。 –

+0

頻繁に変更されるポストごとの単一のint値。 – zsharp

+0

それから私は私の答えで正しかった。ポストテーブルの評価を保持してください。まれなケースがあります。それを別のテーブルに移動することをお勧めしますが、間違いないはずです。 –

答えて

2

あなたの投稿テーブルに評価フィールドを直接入れる必要があります。それはnormalizationの質問です。機能的な依存関係がないため、その値を分けても何も勝てません。

まれに、このようなフィールドを別のテーブルとして追加することがあります。たとえば、評価値を既存のテーブルに追加する必要があり、何らかの理由で新しい列を追加できない場合などです。

また、行が非常に大きく、非常に頻繁に変更される場合は、評価値が頻繁に変更される間にパフォーマンスを得ることができます。

しかし、あなたのケースはどちらのカテゴリにも該当しないとは言いません。ポストテーブルに保持してください。


いくつかの一般的な状況を要約します。

Posts 
======== 
PostId   Ratings 
Text    ========== 
RatingId ====> RatingId 
       RatingName 

使用このあなたは、このような、「良い」「平均」、および「低い」などの可能性の評価値のセットを持っており、すべての記事がこの値を共有する場合。 RatingValueはidで識別される文字列になります。

評価値が単純な数値の場合は、投稿テーブルにその値を含めます。それはおそらくあなたのポイントです。 なぜ格付け名の文字列ではなく、整数の格付け値を含めるのですか?違いは次のとおりです。すべての値は法定格付けであるため、整数評価を含める必要があります。これは文字列の評価には当てはまりません。限定された文字列だけが法定格付けを表すため、それらを別のテーブルに移動する必要があります。あなたがポストごとに複数の評価をお持ちの場合は

Posts 
=========== 
PostId 
Text 
RatingValue 

は、次のことが可能に評価の限定セットのために行くための方法です。

Posts   PostRatings 
========   ===========  Ratings 
PostId <==== PostId    =========== 
Text    RatingId  ===> RatingId 
            RatingName 

整数定格の場合、ポスト定格テーブルに戻します。自然な主キーがないため、人工主キーが必要な場合は追加する必要があります。

    PostRatings 
Posts   ============== 
========   [PostRatingId] 
PostId <==== PostId 
Text    RatingValue 

あなたはユーザーとの評価を関連付け、あなたは再び自然主キーを取得し、ユーザーごとに与えられた後に1つだけの評価を許可した場合。

Posts   PostRatings 
========   ===========  User 
PostId <==== PostId    =========== 
Text    UserId  ===> UserId 
       RatingValue  Name 
1

あなたはちょうど良いデータベースデザインについて啓蒙されたと思います。 2番目のアプローチは正しいですが、レーティングテーブルにはPostsテーブルを参照する外部キーPostIdがあります。

最初のアプローチが実際にどのように機能するかはわかりませんが、評価表の複数の行を参照する投稿テーブルに単一の評価フィールドがありますか?あなたのレーティングには一意ではない参照がありますか?いずれにしても、それは良い練習ではなく、正規化を読み、あなたはそのアイデアを得るでしょう。

+0

私のための混乱は、私は評価を持つオブジェクトとして "ポスト"が表示されます。データをドメインオブジェクトにマップするとき、レーティングフィールドはレーティングテーブルにあるレーティング名のIDになります。 – zsharp

+0

これは、可能な評価値のセットがあるように聞こえます(たとえば、良い、平均、悪いなど)。そして、各投稿にそのような評価を割り当てたいとします。これは多対多マッピングであり、実際にはそれを表すために3つのテーブルが必要になります。 –

+0

例を使用して質問を編集できますか – MrTelly

関連する問題