特定のアプリケーションのパフォーマンスを向上させるために行われた非正規化についてはよく耳にします。しかし、私はそれに関連したことを試したことはありません。
そこで、正規化された DB のどの部分でパフォーマンスが低下するのか、言い換えれば、非正規化の原則とは何なのか、興味があります。
パフォーマンスを向上させる必要がある場合、このテクニックをどのように使用できますか?
ベストアンサー1
非正規化は一般に次のいずれかの目的で使用されます。
- 一定数のクエリを避ける
- いくつかの結合を削除する
非正規化の基本的な考え方は、冗長データを追加したり、いくつかをグループ化したりして、それらのデータをより簡単に、より少ないコストで取得できるようにし、パフォーマンスを向上させることです。
簡単な例を挙げてください。
- ブログの「投稿」と「コメント」テーブルを考えてみましょう
- 各投稿ごとに、「コメント」テーブルに複数の行が表示されます。
- つまり、関連するコメント数とともに投稿のリストを表示するには、次の操作を行う必要があります。
- クエリを1回実行して投稿を一覧表示する
- 投稿ごとにクエリを1つ実行してコメントの数をカウントします(はい、それらを 1 つに結合して、すべての投稿の数を一度に取得できます)
- つまり、複数のクエリが必要になります。
- ここで、Posts テーブルに「コメント数」フィールドを追加すると、次のようになります。
- 投稿を一覧表示するには1つのクエリだけが必要です
- また、コメント テーブルをクエリする必要はありません。コメントの数はすでに投稿テーブルに非正規化されています。
- さらに、1 つのフィールドだけを返すクエリの方が、複数のクエリよりも優れています。
さて、確かにコストはかかります。
- まず、冗長な情報があるため、ディスクとメモリの両方でいくらかのスペースが必要になります。
- コメント数は投稿テーブルに保存されます
- コメント表でもその数字を確認できます
- 次に、誰かがコメントを追加/削除するたびに、次の操作を行う必要があります。
- もちろんコメントを保存/削除します
- また、Posts テーブル内の対応する番号も更新します。
- しかし、あなたのブログを読んでいる人の数がコメントを書いている人の数よりはるかに多い場合、これはそれほど悪いことではないかもしれません。