0

ユーザーが任意の製品についてコメントを残すことができるストア Web サイトがあるとします。

Web サイトのデータベースにテーブル (エンティティ) があるとします。それを「靴」、「帽子」、「スケート」とします。すべてのエンティティ (「shoes_comments」、「hats_comments」、「skates_comments」など) ごとに個別の「コメント」テーブルを作成したくありません。私の考えは、どうにかしてすべてのコメントを 1 つの大きなテーブルに格納することです。

私が考えたこれを行う1つの方法は、テーブルを作成することです:

table (comments): 
ID (int, Primary Key), 
comment (text),  
Product_id (int), 
isSkates (boolean), 
isShoes (boolean), 
isHats (boolean) 

コメントを持つ可能性のあるすべてのエンティティのようなフラグ。

次に、ある製品のコメントを取得したい場合、SELECT クエリは次のようになります。

SELECT comment 
FROM comments, ___SOMETABLE___
WHERE ____SOMEFLAG____ = TRUE 
  AND ___SOMETABLE___.ID = comments.Product_id

これは、必要な機能のためにデータベースを実装する効率的な方法ですか? 他にどのような方法がありますか? >

4

3 に答える 3

1

申し訳ありませんが、これは奇妙に感じます。

製品タイプごとに 1 つの個別の表がありますか? 共通のフィールド (名前、説明、価格、製品画像など) はありませんか?

テーブルに関する私の推奨事項:product共通フィールドの場合comments、外部キーはありますが列はproductなく、帽子の製品ラインに固有のフィールドのみがあります。の主キーは、PK または個々の一意の値のいずれかです (その場合、外部キー用に追加のフィールドが必要になります)。hasXhathatproductproduct

于 2012-04-21T20:52:48.313 に答える
1

コメント用に 1 つのテーブルを作成し、コメント テーブルで他のテーブルの外部キーを使用することをお勧めします。

于 2012-04-21T20:44:21.640 に答える
0

これを行うための「正規化された」方法は、靴、帽子、スケート靴 (コメントを含む) に共通するすべての特性をグループ化するエンティティ (「製品」など) をもう 1 つ追加することです。

              +-- 0..1 [Shoe]
              |
[Product] 1 --+-- 0..1 [Hat]
    1         |
    |         +-- 0..1 [Skate]
    *
[Comment]

パフォーマンスの考慮事項以外に、ここでの欠点は、Product の行が Shoe の行と Hat の行の両方によって参照されることを妨げるものがデータ モデルにないことです。

他の選択肢もあります (それぞれに特典と欠点があります) - 「jpa 継承戦略」について何かを読みたいと思うかもしれません - 同じ問題を議論する Java 固有の記事を見つけることができます (Java のせせらぎを無視して残りを読んでください)

個人的には、階層内のすべてのエンティティ (私たちの場合は靴、帽子、スケート靴) に対して 1 つのテーブルを使用し、パフォーマンスとシンプルさの祭壇に対する制約を犠牲にすることがよくあります (例: 靴に必須のフィールドでは null ではありませんが、帽子やスケート靴には使用できません)。

于 2012-04-21T21:05:49.990 に答える