どちらの手法もメリットがあり、答えは意見に基づいている可能性があります。私のです。イメージがプライマリであるかどうかを示すフィールド(例: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は違反しません
しかし、画像には複数のプロジェクトが存在する可能性があるため、ジャンクションテーブルにカバーカラムを追加して機能させる必要があります。 – Disheart
ああ、あなたは絶対に正しいです、あなたはあなたの質問でそれを言いました。私は答えを書くときにそれを忘れていたことを謝罪します。その場合、そのプロパティはプロジェクトとイメージの両方に関連付けられているため、ジャンクションテーブルに 'cover'を追加してください。そして、2番目の正規形に違反しません。いい視点ね。 – zedfoxus