哲学的な答え: 次善の (リレーショナル) データベースには、挿入、更新、および削除の異常が蔓延しています。これらはすべてデータの不整合につながり、結果としてデータ品質が低下します。データの正確性を信頼できない場合、それは何の役に立つでしょうか? 自問してみてください: 正しい答えを遅くしたいですか、それとも間違った答えを早くしたいですか?
実際問題として、すぐに取得する前に取得してください。私たち人間は、どこでボトルネックが発生するかを予測するのが非常に苦手です。データベースを優れたものにし、適切な期間にわたってパフォーマンスを測定してから、高速化する必要があるかどうかを判断してください。非正規化して精度を犠牲にする前に、他の手法を試してください。より高速なサーバー、接続、db ドライバーなどを入手できますか? ストアド プロシージャによって速度が向上する可能性はありますか? インデックスとその FILL FACTOR はどうですか? これらおよびその他のパフォーマンスおよびチューニング手法でうまくいかない場合にのみ、非正規化を検討してください。次に、パフォーマンスを測定して、「支払った」速度が向上したことを確認します。悲観化ではなく、最適化を実行していることを確認してください。
[編集]
Q: 最適化を最後に行う場合、スキーマの変更後にデータを移行する合理的な方法を教えてください。たとえば、ルックアップ テーブルを削除することにした場合、既存のデータベースをこの新しい設計に移行するにはどうすればよいですか?
A: わかりました。
- バックアップを作成します。
- 別のデバイスに別のバックアップを作成します。
- 「select into newtable from oldtable...」タイプのコマンドで新しいテーブルを作成します。以前は別個のテーブルを結合するには、いくつかの結合を行う必要があります。
- 古いテーブルを削除します。
- 新しいテーブルの名前を変更します。
しかし...より堅牢なアプローチを検討してください:
今すぐ、完全に正規化されたテーブルにいくつかのビューを作成してください。これらのビュー (仮想テーブル、データの「ウィンドウ」... このトピックについて詳しく知りたい場合は私に尋ねてください) には、上記の手順 3 と同じ定義クエリがあります。アプリケーションまたは DB 層のロジックを作成するときは、ビューを使用します (少なくとも読み取りアクセス用です。更新可能なビューは... 興味深いものです)。次に、後で非正規化する場合は、上記のように新しいテーブルを作成し、ビューを削除して、新しいベース テーブルの名前を変更します。アプリケーション/DB レイヤーは違いを認識しません。
実際にはこれにはさらに多くのことがありますが、これで始めることができます。