非正規化しすぎると、スペースと時間が無駄になると思います
ほとんどの中規模の基幹業務OLTPアプリケーションでは、スペースについて心配する必要はありません。したがって、スペースを確保してください。時間、そして私はあなたがクエリのパフォーマンスを意味すると仮定しますが、これは通常は強化することができ、設計が悪い、リソースが不十分、データベースが非常に大きい、トランザクションの数が非常に多い、またはすべてでない限り、実際の問題を引き起こしません上記。今日のデータベースを使用するほとんどのアプリケーションでは、データベースが正規化されているという理由だけでパフォーマンスの問題が発生することはほとんどありません。
巨大なブロブが重複しているか、トランザクションを使用して複数のフィールドを更新する必要があるため、一貫性を維持することが難しいためです。
データベースを正規化すると、設計で次のことが保証されます。
冗長データはありません。
膨大な数のログ腸炎が作成されないようにする(例:200万人の顧客のテーブル:UPDATE Customer Set Country = "USA" WHERE Country = "US")
SQLクエリで完全にサポートされます。この点は非常に重要です。
クリーンなアプリケーションコードを実行します。
アプリケーションに負担をかけずに、データベースを介して高度なデータ整合性を強制します。
異なるアプリケーションで同じコードをコーディングせずに、異なるアプリケーションによってデータベースで定義されたビジネスルールを共有します。
とはいえ、正規化はすべての列とテーブルに最適な構造を生成します。これは、特定のアプリケーションで常に必要とは限らない場合があります。ドメインとアプリケーションを理解した上で、速度のトレードオフとしてテーブル/列の一部を非正規化することを決定できます。ただし、それは見落としではなく意識的な決定です。
3NF FDセットと一連のクエリがある場合、非正規化のスピードアップ/スローダウンを予測するにはどうすればよいですか?
テストなしでパフォーマンスを正確に予測することはできません(アプリケーションコードを記述する前に行うことができます)。ただし、設計により、パフォーマンスの低下につながる要因を排除して検出できます。たとえば、次のように使用するインデックス戦略を特定できます(他の手法が存在する場合があります)。
クエリとそれらのクエリの影響を受ける列のマトリックスを作成します。
最も使用されている列を見つけます。
それらの列にインデックスを作成することを検討してください。
これは主に、DBAが支援できる仕事です。パフォーマンスには、正規化以上のものがあります。ディスクボリュームへのデータ分散、垂直テーブル分割、パーティション化、インデックスタイプ、インデックスバッファリングなどの側面があります。このような手法はすべて、「データベースの設計」および「データベースのパフォーマンスチューニング」という主題の本やベンダーのドキュメントで対処する必要があります。上記の説明はすべて、アプリケーションがOLTPアプリケーションであることを前提としています。