データの非正規化:完全ガイド

Platform Shanika Wickramasinghe

組織が扱うデータの量が増えるにつれ、データのアクセスと処理を高速化する必要性が高まっています。データの非正規化は、データベースのクエリーパフォーマンスを向上させるために広く利用されている手法です。

この記事では、データの正規化とその重要性、そしてデータの正規化手法と非正規化手法の違いについて説明します。また、特に重要なポイントとして、非正規化アプローチのメリットとデメリットについても解説します。

データの非正規化とは

データの非正規化は、データベースのクエリーパフォーマンスを最適化するために、正規化済みのデータベースに一定の冗長性を持たせるプロセスです。さまざまな手法を使用してあらかじめ計算された冗長性を導入することにより、正規化されたデータの問題を解決できます。非正規化には次のような手法があります。

ただし、データの非正規化を行うと、データの書き込みパフォーマンスと読み取りパフォーマンスの間にトレードオフが発生します。

データの非正規化の仕組み

まず、正規化されたデータベースについて見ていきましょう。正規化されたデータベースには、各情報が1つだけあり、関連するデータは別々のテーブルに存在します。このため、実際のアプリケーションで使用するデータは、クエリーを使用して複数のテーブルのデータを結合して取得する必要があります。

しかし、データ量が増加したり、複数のテーブルを結合する複雑なクエリーがあったりすると、データベースのパフォーマンスが大幅に低下したり、クラッシュが発生したりする可能性があります。

たとえば、顧客が商品を注文できるオンラインショップを運営しているとします。こうしたeコマースプラットフォームでは通常、顧客データと注文データは別々のテーブルに含まれており、注文データテーブルには、顧客情報に関連付けるための顧客データテーブルへの外部キーが含まれています。

このショップのWebサイトで、ある顧客が行ったすべての注文を表示する必要があるとしましょう。正規化されたデータストアでは、この処理を実行するために注文テーブルと顧客テーブルを結合する必要があります。このオンラインショップが大量の注文を受けたり、顧客数が大幅に増えたりすると、この結合操作の計算負荷が高くなり、Webサイトのパフォーマンスが低下する可能性があります。

このような場合、データを非正規化することで、そうした状況下でのパフォーマンスを改善することができます。次のどちらかの方法を実施できます。

データの非正規化と正規化の違い

データの正規化とは、複数のテーブルに各データが重複して存在しないようにすることでデータの冗長性を取り除くプロセスであり、データ間の関係を維持しつつ、非構造化データを排除します。データに正規化を適用するには、主に第1正規形、第2正規形、第3正規形、ボイス・コッド正規形(3.5NF)の4つの方法があります。

正規化されたデータベースは、組織全体のデータを標準化し、論理的に保存するのに役立ちます。また正規化は、さまざまなプロセスに利用できるクリーンなデータセットを提供し、クエリーの応答時間を改善するとともに、データの異常を減らします。

要約すると、データの非正規化と正規化の違いは次の2点にまとめることができます。

  1. データの正規化は、データベースから冗長性を取り除き、重複のない標準化されたデータをもたらします。一方、非正規化は、複数のテーブルのデータを1つのテーブルに結合して、クエリーをより高速に実行できるようにするためのプロセスです。
  2. データの正規化は、一般にテーブルの結合コストが比較的低く、データに対する更新、削除、挿入操作が多い場合に使用されます。一方、非正規化は、データベース内でコストの高い結合クエリーが多数発生する場合に有効です。

データを非正規化するための手法

データの非正規化手法にはいくつかの種類があり、シナリオに応じて使い分けられています。これらの手法には、それぞれメリットとデメリットがあることに注意が必要です。データベースの専門家によって使用されているデータの正規化手法の例を、次にいくつか示します。

手法1. 冗長列の追加/テーブルの事前結合

この手法は、コストの高い結合操作があり、複数のテーブルにあるデータが頻繁に使用される場合に利用できます。こうしたケースでは、頻繁に使用するデータを1つのテーブルに追加します。

たとえば、customerとorderという2つのテーブルがあるとします。顧客の注文を名前とともに表示する場合、顧客の名前をorderテーブルに追加すると、コストのかかる結合操作の負荷が軽減されます。ただし、大量の重複データが発生します。図に示すと、次のようになります。

手法2. テーブルの分割

テーブル分割とは、テーブルを複数の小さなテーブルに分解して、クエリーや管理を容易にするプロセスです。テーブル分割には、水平テーブル分割と垂直テーブル分割の2つの方法があります。

水平テーブル分割

テーブルの行を小さなテーブルに分割します。各テーブルは同じ列を持ちます。このアプローチは、データテーブルを地域、物理的な場所、タスクなど、さまざまなシナリオに基づいて分離できる場合に便利です。

たとえば、大学の理学部のすべての学科の学生情報を含むテーブルがあるとします。図に示すように、このテーブルは、コンピューターサイエンス、化学、数学、生物学などの学科ごとに分割できます。

このようにすると、元のテーブルに比べてより小さなデータセットがクエリーの対象となります。したがって、この手法を利用することで、学科に基づいたクエリーのパフォーマンスが向上します。

垂直テーブル分割

垂直分割では、列に基づいてテーブルを分割し、分割した各部分にプライマリキーを適用します。

たとえば、ある病院が患者ID、名前、住所、病歴の列を含む「Patients」テーブルを管理しているとします。次の図に示すように、垂直分割を使用して、「Patient_details」と「Patient_medical_history」の2つの新しいテーブルを作成できます。

このアプローチは、テーブルの一部の列が他の列よりも頻繁にアクセスされる場合に最適で、必要な属性のみを取得し、不要なデータを除外することができます。

手法3. 派生列の追加

次の例を考えてみましょう。StudentとStudent_Gradesの2つのテーブルがあるとします。

アプリケーションで学生の合計点数とその詳細を表示する必要がある場合、学生ごとにすべての課題の合計点数を含む新しい派生列を追加できます。派生列を追加すれば、データベースに対してクエリーを実行するたびに合計点数を計算する必要がありません。

手法4. ミラーリングしたテーブルの使用

この手法では、既存のテーブルの全体または一部のコピーを作成して別の場所に格納し、クエリーのパフォーマンスが向上するように最適化します。一般にミラーテーブルは、読み取り負荷の高いワークロードに対応するために、インデックスの追加作成やデータ分割などの手法を通して使用されます。こうしたミラーテーブルを利用することで、分析クエリーのような読み取り負荷の高い処理に対応できます。

このアプローチでは、データベースの複製を作成し、それらを別々のデータベースインスタンス内または物理サーバー上に格納する必要があります。ただし、データの複数のコピーを維持して同期するなどの複雑な作業が伴うため、高額なコストがかかったり、必要なリソースが増えたりする可能性があります。

手法5. マテリアライズドビュー

マテリアライズドビューとは、あらかじめ計算したクエリー結果を別のテーブルに格納したものをいいます。この対象となるのは、一般的に、非常にコストが高く、頻繁にアクセスされるデータを返す「結合」クエリーや「集計」クエリーです。マテリアライズドビューを活用すれば、次回からはデータベースで同じクエリーを繰り返し実行することなく、必要に応じてマテリアライズドビューからデータを取得できます。

データの非正規化のメリット

データを非正規化することで、組織はいくつかのメリットを得られます。

クエリーパフォーマンスが改善され、ユーザーエクスペリエンスが向上する

正規化されたデータストアに対してクエリーを実行するには、要求内容によっては、異なる種類のテーブルから結合を何度も実行しなければならない場合があります。このような場合、データが増えると、結合操作のパフォーマンスが低下します。特に、そのような操作が使用頻度の高い機能に関連している場合は、ユーザーエクスペリエンスに悪影響を与える可能性があります。

頻繁にアクセスされるデータを冗長なテーブルに保持してデータを非正規化すれば、テーブル間の結合の回数を減らすことができます。

複雑さが軽減され、データモデルがシンプルに保たれる

データの非正規化は、結合クエリーの数を減らすことで、クエリーの複雑さを軽減します。これにより、開発者やその他のアプリケーションユーザーは、シンプルで保守しやすいコードを記述でき、開発の初心者でもクエリーの内容を理解して、クエリー操作を簡単に実行できます。

さらに、処理をシンプルにすることは、データベース操作に関連するバグを大幅に減らすためにも役立ちます。

アプリケーションのスケーラビリティが向上する

非正規化により、データを読み取る際のデータベーストランザクションの数が減少します。このアプローチは、ユーザー数が多いためにデータベーストランザクションの負荷が大きくなる場合に特に役立ちます。トランザクション数が減少することで、ユーザー数が変動しても対応できるようになり、アプリケーションのスケーラビリティが向上します。

データレポートの生成時間が短縮される

使用統計や販売レポートなど、企業はデータを使用してレポートを無数に生成します。こうしたレポートの生成には、データセット全体を検索してデータを集計したり要約したりする処理が含まれることがあります。テーブルのミラーリングのようなデータの正規化手法を利用すれば、マスターテーブルのパフォーマンスに影響を与えることなくデータベースを最適化し、日々のレポート生成を効率化できます。

データの非正規化のデメリット

上記のセクションで説明したように、データの非正規化にはメリットがある一方で、考慮しなければならないデメリットもあります。

データを正規化すべきか、非正規化すべきか

データの正規化は、冗長なデータを削除します。これに対し、非正規化は正規化されたデータベース上に冗長なデータを作成します。非正規化を行うと、データの更新や挿入のパフォーマンスが低下する代わりに、データの読み取りパフォーマンスが向上します。非正規化には、テーブルの分割、派生テーブルや事前結合されたテーブルの利用など、いくつかの手法があります。こうした手法は、ユーザーエクスペリエンスやクエリーパフォーマンス、そしてスケーラビリティの向上、レポート生成時間の短縮、データの複雑さの軽減といったメリットをもたらします。

しかし非正規化には、データの冗長化、複雑さの増大、保守やストレージにかかるコストの増加、データの不整合など、いくつかのデメリットもあります。

このブログはこちらの英語ブログの翻訳です。

関連記事

カノニカルデータモデル(CDM)の基本
プラットフォーム
8 分程度

カノニカルデータモデル(CDM)の基本

データのやりとりの混乱を避けたいとお考えなら、カノニカルデータモデルを導入すれば、データに関する作業を軽減できます。その具体的な方法をご覧ください。
Azureサービス:完全ガイド
プラットフォーム
9 分程度

Azureサービス:完全ガイド

この記事では、Azureサービスの概要を説明し、PaaSからIaaS、SaaSに至るまで、Microsoft Azureがあらゆるアプリケーション、インフラストラクチャ、およびクラウドのニーズに対応するために提供しているサービスについて解説します。
Dashboard Studio:ダッシュボードのカスタマイズが簡単に
プラットフォーム
5 分程度

Dashboard Studio:ダッシュボードのカスタマイズが簡単に

直感的に使える新しいダッシュボード構築ツール「Splunk Dashboard Studio」の概要と、レイアウトと色のカスタマイズ機能や画像とテキストボックスの追加機能をご紹介します。