非正規化とは、リレーショナル データベースにおける読み取り指向のデータ検索パフォーマンスを高速化するためのアプローチで、データ構造が正規化された後、データベース管理者が冗長なデータの特定のインスタンスを選択的に追加します。
SQLで正規化を使用すると、データベースは、異なるが関連するタイプのデータを、リレーションと呼ばれる別々の論理テーブルに格納します。 クエリが複数のテーブルのデータを1つの結果テーブルにまとめることを結合といいます。
正規化と非正規化
同じクエリに複数の結合があると、パフォーマンスに悪影響を及ぼします。 デザインによって生成されるテーブルの数が増えると、結合の複雑さによって受け入れがたいコンピューティング オーバーヘッドが生じる可能性があります。
データベースの非正規化では、データ設計者は異種のテーブルをつなぎ合わせます。 これは、多くのデータの冗長性を犠牲にして行われますが、結合の数を削減し、操作を高速化するのに役立ちます。 データベース設計者にとってのトレードオフは、リソースやクエリのインタラクティブ性の要件に応じて、大きなテーブルを少なくするか、小さなテーブルを多くするかというデータベースシステムを作ることです。
データが複製された後、データベース設計者は、データの複数のインスタンスをどのように維持するかを考慮しなければなりません。 データベースを非正規化する一つの方法は、データベース管理システムが冗長なデータをディスクに保存することです。 これには、冗長コピーの一貫性を確保できるという利点があります。 ディスクのコストが年々下がっていることもあり、このような方法は人気があります。
論理データの設計
非正規化のアプローチの 1 つは、実際の論理データの設計を非正規化することです。 これでは、すぐに矛盾したデータになってしまいます。 制約と呼ばれるルールを使用して、情報の冗長コピーの同期方法を指定することができますが、データベース設計の複雑さが増し、書き込みパフォーマンスに影響を与える危険性もあります。
非正規化が効果的に使用される一般的なケースとしては、共通の用途のためにデータをパッケージ化した事前結合テーブル、特定のユーザー グループ用に調整された分割テーブル、1対1および1対多の関係を統合した結合テーブルなどがあります。
データ ウェアハウスおよび NoSQL における非正規化
リレーショナル データ ウェアハウスでは、非正規化が重要な役割を果たすことがよくあります。 これは、データウェアハウスの設計者であり、著者としても影響力のあるRalph Kimball氏が提唱する次元データベースでは特に顕著です。 正規化を使用した次元構造の強調は、クエリの実行を高速化することを目的としており、ビジネス・インテリジェンスを目的としたデータウェアハウスでは特に重要となります。
非正規化の例は、SQLにおける非正規化だけではありません。 ある種の非正規化は、リレーショナル・データベースの外でも使用されています。 この技術は、NoSQLデータベース、特にドキュメント指向のNoSQLデータベースをベースにしたアプリケーションでよく採用されます。 このようなデータベースは、読み取りの最適化を必要とするウェブ・プロファイル・ページのコンテンツ管理アーキテクチャによく用いられます。 ここでの非正規化の目的は,異種のプロファイル・データからなるページを組み立てるのに必要な時間を短縮することです. このようなケースでは、データの一貫性を維持することがアプリケーションの仕事となり、ひいてはアプリケーション開発者の仕事となります。