で使用するリレーショナルデータベースを設計しています MySQL。次の状況があります。1つのテーブルに、ほとんどの状況でNULL
であるフィールドがあります。フィールドは次のようになります。
Table name: tabla
Fields:
idtabla not null,
text (varchar(n)) not null,
image (mediumblob) {this can be null}
疑問:別のテーブルを作成し、イメージを使用する必要がある場合は、新しいテーブルにクエリを実行する方がよいでしょうか。なぜあなたのソリューションはデザインに優れているのですか? MySQLの時間応答、クエリ作成のしやすさなど。
ここではほとんど哲学的な論点に触れています:リレーショナルデータベースの派生元である「クローズドワールド」の想定に違反しているため、NULL可能値を許可する必要があります(関連するセクション http://en.wikipediaを参照)。 .org/wiki/Null_(SQL) と他の多くの質問 なぜNULLを許可しないのか などの注意事項について)不明な値(またはすべての状況で単に適用されない可能性がある)を独自の関係(テーブル)に分割して不明な値を回避し、不明な値がないようにしますが、値が不明な場合は存在しません。これは理論を満たしますが、それをあまり望ましくない実際的な影響があります。
JOIN
操作はほとんどのRDBMSで無料ではありません。追加のテーブルでプロパティを検索すると、クエリを満たすためにエンジンが実行する必要のある作業が増加します。INSERT
またはUPDATE
のいずれかになります。もちろん、最初のポイントが逆になり、特性を壊すと効率が向上する状況があります。
INSERT
またはUPDATE
のコア情報のみを更新する場合は、書き込みが少なく、これらの追加のプロパティに制約またはトリガーがある場合、行の変更ごとにこの処理が回避される可能性があります。 。あなたの例は、画像(またはblob型の列に少なくとも大きなデータのビット)を格納しているように見えます。ここでは、さらに2つの考慮事項があります。
SELECT *
とにかく、ページあたりの行数ボーナスを「無料」で獲得できます。tl; dr:だから、難しい答えはありません。私のアドバイスは、データの概念モデルに最も適したものを実行することです。そのため、維持するための考慮事項が少なくて済みます。これは、常にではありませんが、通常、個別のテーブルではなくNULL可能列を使用することを意味します。データが本当に大規模でない限り、パフォーマンスの違いは無視できます。
画像用の個別のテーブルが役立つかどうかは、画像と元のテーブルの残りの属性との関係のカーディナリティによって異なります。
別の画像テーブルは、次のいずれかの場合に正当化できます。
画像が行ごとに一意である場合、別の画像テーブルを使用する場合にnull外部キーがあるため、nullフィールドについて心配する必要はありません。
画像を元のテーブルに保持することにした場合は、必要な場合にのみ画像を取得することをお勧めします(データの場合と同様に、必要な場合を除いてSELECT *
を使用しないでくださいall利用可能なデータ)。