「[A]ほとんどすべて使用されている」とは、検討すると、より自然に分割できることを示しています。
ここでの効率に関する懸念の多くは、次の3つに分類されます。
- 1つのテーブルは、複数のテーブルを結合するよりもすばやくスキャンできます。
- 大きな行には、それ自体でメモリとディスクスペースのコストがかかります。
- 単一のテーブルが実際には1対多であるものを表す場合、挿入、削除、または更新でより多くの作業が必要になります。
ポイント2は、データの1つの特定のサブセットが必要な場合と、別のサブセットが必要な別のバッチが必要な場合、およびそれらすべてが必要な場合はごくわずかである場合にのみ、実際に役立ちます。ほとんどの場所でほとんどの列を使用している場合、何も得られません。その場合、テーブルの分割は良くありません。
ポイント1と3は、それぞれ1つの大きなテーブルに参加することに賛成と反対を主張しています。
その前に、「ほぼすべて」に戻りましょう。nullフィールドのバッチを含む行が複数ある場合、なぜですか?多くの場合、「なぜ?」と答えます。そこには実際に自然な分割があり、通常の正規化の一部として別のテーブルに分割する必要があることを示しています*。フィールドの繰り返しは、これが事実であるというさらに大きな示唆です。
最初にこれを行います。
非正規化すること(自然に1つのテーブルを分割するか、自然に複数のテーブルを結合するか)は、非常に特殊なタイプの最適化です。これにより、効率が低下する代わりに効率が向上し、バグの可能性が生じます。それ以外は存在しません。私はあなたが決して非正規化すべきではないとは決して言いません-私はそれを自分で行います-しかしあなたは「私はこの方法でテーブルXとYを非正規化しています。ケースDの費用」。次に、隠れたコストを探すとともに、実際にケースCとケースDがわずかに役立つことを確認する必要があります。
そもそも正規化する理由の1つは、幅広いケースで良好な平均パフォーマンスが得られることです。それはあなたがほとんどの場合望むバランスです。正規化されたデータベースを開始点として使用するのではなく、最初から非正規化することは、ほとんどの場合時期尚早です。
*おもしろい雑学クイズ:「正規化」という名前は、リチャードニクソンの「ベトナミゼーション」ポリシーを一部取り入れたもので、ほぼすべてに「-化」を追加するという冗談がいくつかありました。テト攻勢に対するホワイトハウスの反応がなければ、代わりにゲルナンドの「正規化」またはまったく異なるものを使用することができました。