2016-06-12 6 views
0

私は、ジャンクションテーブルを介してイメージテーブルと多対多の関係を持つプロジェクトテーブルを持っています。私はまた、プロジェクトのために複数の表紙画像を追加したい。1つのテーブルから複数の行をグループ化しますか?

私は画像テーブルからいくつかの行をグループ化したい複数のテーブルを持っています。カバーイメージの場合はブール値の列を追加する必要がありますか、カバーとして必要なイメージのIDを使用して1対多のテーブルを作成する必要がありますか?そして、もし私がいくつかの列を追加すると、ほとんどの列の値がnullになると重複しないでしょうか?

イメージテーブルからイメージを選択したいが、sortorderのような追加の列を追加するクライアントテーブルと規律テーブルもあります。

答えて

0

どちらの手法もメリットがあり、答えは意見に基づいている可能性があります。私のです。イメージがプライマリであるかどうかを示すフィールド(例:cover)をイメージテーブルに追加することをおすすめします。 coverフィールドにほとんどの行がNULL値を持つことは問題ありません。 imageidと表紙に索引を作成します。

CoverImagesというビューを作成することをお勧めします。このビューは、カバーイメージだけを必要とするアプリケーションがこのビューを直接使用できるように、select ... from images where cover=trueとなります。データベースエンジンによっては、スパース列を作成したり、フィルタリングされたインデックスを作成したりすることができます。

もう1つの方法は、projectidとimageidを持つジャンクション表にcoverを追加することです。しかし、それはcoverがプロジェクトではなく画像の属性になるため、データベース正規化の2番目の正規形式に違反します。

表紙画像である画像を1対多の表に入れるというオプションは、フラグを追加すると問題になることがあります。イメージに機密としてフラグが立てられている場合は、別のテーブルを作成し、それに敏感なイメージIDだけを置く必要があります。

最後の2つの考えに基づいて、coverフラグを画像表に入れることをおすすめします。

EDIT

OPはIMAGEID 1は、Project1のためではなく、Project2のためにカバーすることができることを思い出しました。これは、coverがジャンクション・テーブルに関連付けられ、イメージ・テーブルに関連付けられてはならないことを意味します。 2NFは違反しません

+0

しかし、画像には複数のプロジェクトが存在する可能性があるため、ジャンクションテーブルにカバーカラムを追加して機能させる必要があります。 – Disheart

+0

ああ、あなたは絶対に正しいです、あなたはあなたの質問でそれを言いました。私は答えを書くときにそれを忘れていたことを謝罪します。その場合、そのプロパティはプロジェクトとイメージの両方に関連付けられているため、ジャンクションテーブルに 'cover'を追加してください。そして、2番目の正規形に違反しません。いい視点ね。 – zedfoxus

関連する問題