私のチーム リーダーが、過去のいくつかのプロジェクトでは、クエリを高速化するために正規化を廃止しなければならなかったと言っているのを聞きました。
テーブルユニオンと関係があるのではないかと思います。
無駄のないテーブルを増やすことは、太いテーブルをほとんど持たないことよりも効率が悪いのでしょうか?
私のチーム リーダーが、過去のいくつかのプロジェクトでは、クエリを高速化するために正規化を廃止しなければならなかったと言っているのを聞きました。
テーブルユニオンと関係があるのではないかと思います。
無駄のないテーブルを増やすことは、太いテーブルをほとんど持たないことよりも効率が悪いのでしょうか?
それは依存します...テーブルの結合は、「事前に結合された」、つまり非正規化された1つの大きなテーブルを持つよりも本質的に遅くなります。ただし、非正規化により、データの重複が発生し、テーブルが大きくなります。正規化は、「任意の」質問に答えることができるデータベースを作成するため、良いことと見なされます。適切に行われれば、選択を構築してデータを取得できます。これは、他の形式の DB には当てはまらず、それらは現在 (ほとんど) 歴史的な無関係であり、正規化された/関係 DB がその戦いに勝利しました。
質問に戻りますが、非正規化を使用して物事を高速化することは、広く受け入れられている手法です。通常、DB をしばらく実行して、何を非正規化し、何をそのままにしておくかを確認することをお勧めします。また、データを「正しい」正規化形式のままにして、非正規化されたレポートのセットにデータを取り込むことも一般的です。定期的にテーブル。そのプロセスがレポート実行自体の一部として行われる場合、データも常に最新です。
過度の正規化の例として、過去に曜日と月が別々のテーブルに取り出された DB を見てきました。日付自体が正規化されていました。
OLTP (オンライン トランザクション処理) データベースとOLAP (オンライン分析処理) データベースの違いについて調査する必要があります。
つまり、主にトランザクションの記録 (OLTP) に関係するデータベース システムは、通常、より正規化された方法で構造化され、データの重複を減らし、最適化されたデータ検索を犠牲にしてレコードの作成と更新を容易にします。
データの取得と分析 (OLAP) に重点を置いたデータベース システムは通常、正規化されていない方法で構造化されており、クエリと分析の速度を最大化するためにデータ ストレージの最適化が犠牲になっています。
データベースの正規化と非正規化は、このトレードオフの中心にあります。
私のOracle OLTPデータベースの長年の経験では、そのうちのいくつかは非常に大きくて忙しいものでしたが、「パフォーマンスのための非正規化」が本当に必要なケースに遭遇したことは一度もありませんでした。しかし、潜在的なパフォーマンスの問題に対する恐れ、不確実性、疑いのために、非正規化を適用する必要があると誰かが事前に決定した多くのケースを見てきました。これは通常、ベンチマークなしで行われており、実際にはパフォーマンスの向上が達成されていないことが常にわかりますが、データ保守コードは以前よりもはるかに複雑になっています.
OLAP は非常に異なる動物であり、私はそれについてコメントする立場にありません。
Jeffがこれについて書き、続いて激しい議論が行われました。また、SO に関する多くの議論の対象でもあります。たとえば、より良いデータベースはより多くのテーブルまたはより多くの列を設計します。他の人が指摘したように、常識を使用し、過度に正規化しないでください。
この質問はあまりにも頻繁に繰り返されます。主な理由は、圧倒的な差をつけて最も人気のあるデータベース言語である SQL と、その最も一般的な実装のすべてが、論理テーブルの設計と物理テーブルの設計を混同しているためです。
永遠の答えは、常に論理テーブルを正規化する必要があるということですが、実際的な答えは、既存の SQL 実装で特定の最適化を実装する唯一の方法は、物理テーブルの設計を非正規化すること (それ自体は悪いことではありません) であるという事実によって複雑になります。これらの実装では、論理テーブルの設計を非正規化する必要があります。
要するに、それは依存します。非正規化がパフォーマンスにとって重要な場合もありますが、パフォーマンスに関連する他のすべてのことと同様に、このルートを検討する前に、測定、測定、測定する必要があります。
パフォーマンスは、RDBMS で行われる正規化の量に反比例します。そうは言っても、表が正常であればあるほど、エラーの可能性は低くなります。すべてのデータが 1 つのテーブルに保持される時点で、非正規化によって RDBMS のパフォーマンスが低下する可能性があります。
正規化がパフォーマンスを低下させることが知られている理由は、結合がかなり高価であるためです。テーブル X に N 個のレコードがあり、テーブル Y に M 個のレコードがある場合、X と Y を結合すると、N*M 個のレコードを持つ一時テーブルが作成されます。データベースが不要な場合にテーブル全体を生成しないために使用する最適化のトリックがありますが、それでもすべてのレコードを処理する必要があります。
非正規化とは、データベースの純粋性を確保するために、よく使用されるデータを 1 つのテーブルにまとめてパフォーマンスを向上させるプロセスです。ほとんどの人は、中間ステップをスキップするために意図的に非正規化されたスキーマを設計する場合でも、許容できる取引であると考えています。