正規化されたスキーマの長所と短所メモ。実践ハイパフォーマンスMySQLより引用。
正規化されたスキーマの長所と短所
※データベースはMySQLを前提としている。
書き込みが多いデータベースでは、スキーマの正規化により得られるメリットが多い。その理由は以下の通り。
- 正規化された更新は非正規化された更新よりも通常は高速
- データがうまく正規化されていれば、データの重複がほとんどあるいは全くないため、変更するデータが少なくなる
- 通常は正規化されたテーブルの方が小さいため、メモリ内にうまく収まり、パフォーマンスもよくなる
- 冗長なデータがないということは、値のリストを取得する時にDISTINCT等が必要ないということであり、クエリがその分単純化する
正規化されたスキーマの欠点は、通常はSELECTに関連していることが多く、その理由は以下の通り。
- スキーマが十分に正規化されている場合、複雑なクエリでは1つ以上のJOINが必要になる
- JOINが必要になると、一部のインデックス戦略に制約が課されることになる
非正規化されたスキーマの長所と短所
非正規化されたスキーマの意義は、全てのデータが同じテーブルに含まれていて、JOINが不要になることにある。さらに具体的なメリットは以下の通り。
- JOINが不要な場合、ほとんどのクエリにとって最悪のケースはフルテーブルスキャン。ランダムI/Oが回避されるため、データがメモリ内に収まらない場合のフルテーブルスキャンは、JOINよりもはるかにパフォーマンスがよい可能性がある
- テーブルが1つになることで、1つのインデックスでソートとフィルタリングを同時に行うような高度なインデックス戦略が可能となる
非正規化されたスキーマにも欠点はあり、それは正規化されたスキーマの長所のちょうど反対になる。
正規化と非正規化の適度なバランス
完全に正規化されたスキーマと完全に非正規化されたスキーマは現実の問題に適用しづらい。現実的には、部分的に正規化されたスキーマ、キャッシュテーブル、さらにその他の方法を組み合わせることでよい結果になることが大半である。
さらに詳細については、実践ハイパフォーマンスMySQL P137〜をご参照ください。