【ITニュース解説】A Guide to Database Normalization & Denormalization (With Visual Examples and Practical Use Cases)

2025年09月04日に「Dev.to」が公開したITニュース「A Guide to Database Normalization & Denormalization (With Visual Examples and Practical Use Cases)」について初心者にもわかりやすいように丁寧に解説しています。

作成日: 更新日:

ITニュース概要

データベースの正規化は、データの重複を減らし整合性を高める手法だ。1NFから5NFまで段階があり、それぞれ異なる問題に対応する。非正規化は、性能向上のため意図的に冗長性を加える手法で、読み込みが多い場面で有効だ。まずは正規化でデータの整合性を確保し、必要に応じて非正規化を検討する。

ITニュース解説

データベースの設計において、「正規化」は非常に重要な概念であり、システムの基盤を強固にするための土台となる。これは、データベース内のデータを効率的かつ整合性の高い状態で管理するためのプロセスであり、具体的にはデータの重複(冗長性)を最小限に抑え、データの正確性(整合性)を向上させることを目的としている。テーブルを適切に分割し、それらの間に正しい関係を定義することで、データの保管や更新が容易になり、将来的な拡張性も高まるのだ。

正規化の主な目標は三つある。一つ目は、データベース内に同じデータが複数存在することをなくすこと。これにより、記憶領域を節約できるだけでなく、データが不整合になるリスクも大幅に減少する。二つ目は、データ間の依存関係が論理的に意味のある形になっていることを保証すること。例えば、ある情報が別の情報に依存している場合、その依存関係が明確で正しく設計されている必要がある。三つ目は、データベースの保守性を高め、データを扱いやすくすることだ。データの構造が整理されていれば、変更や修正が容易になり、エラーも起きにくくなる。

正規化には段階があり、一般的には第一正規形(1NF)から始まり、第二正規形(2NF)、第三正規形(3NF)、ボイス・コッド正規形(BCNF)、第四正規形(4NF)、第五正規形(5NF)へと進むにつれて、より厳密なルールが適用され、データの整合性が高まっていく。

まず、「第一正規形(1NF)」は、すべての正規化の基礎となる。この形式では、テーブルのすべての列が「アトミックな値」を持つ必要がある。アトミックな値とは、それ以上分割できない単一の値を意味する。具体的には、一つのセルの中に複数の値がリスト形式や配列形式で格納されていたり、繰り返し存在するようなグループが含まれていたりしてはならない。例えば、「注文ID」と「商品」という列があるテーブルで、「商品」のセルに「ノートパソコン、マウス、キーボード」のように複数の商品がカンマ区切りで入っている場合、これは1NFではない。1NFにするには、これを「注文ID:101, 商品:ノートパソコン」「注文ID:101, 商品:マウス」「注文ID:101, 商品:キーボード」というように、各商品を別々の行に分割し、各セルに一つのアトミックな値のみが来るようにする。

次に、「第二正規形(2NF)」は、1NFの条件を満たした上で、さらに一歩進んだルールを適用する。2NFでは、テーブル内の「非主キー属性」(主キーではない列)が、「主キー全体」に完全に依存している必要がある。つまり、複合主キー(複数の列を組み合わせて主キーとする場合)を持つテーブルにおいて、非主キー属性が主キーの一部にだけ依存する「部分関数従属性」を排除する。例えば、「注文ID」と「商品ID」を複合主キーとし、「商品名」という非主キー属性がある場合、商品名は「商品ID」にのみ依存し、「注文ID」には直接依存しない。このような状況では、商品名を注文詳細テーブルから分離し、商品IDを主キーとする独立した「商品テーブル」を作成する。そして、元のテーブルは「注文ID」と「商品ID」のみを持つ「注文詳細テーブル」とする。これにより、商品の情報が重複して登録されることを防ぎ、データの一貫性を保つことができる。

「第三正規形(3NF)」は、2NFの条件を満たした上で、「推移的関数従属性」を排除する。推移的関数従属性とは、非主キー属性が主キーではなく、別の非主キー属性に依存している状態を指す。つまり、「非主キー属性は、主キーに、主キー全体に、そして主キー以外の何物にも依存しない」という厳格な原則を適用する。例えば、「学生ID」「学部」「学部長」という列があるテーブルを考える。ここで「学生ID」が主キーだとすると、「学部」は「学生ID」に依存し、「学部長」は「学部」に依存している。つまり、「学部長」は「学生ID」に直接依存するのではなく、「学部」を経由して間接的に依存していることになる。これを解消するためには、「学生ID」と「学部」を持つ「学生テーブル」と、「学部」と「学部長」を持つ「学部テーブル」に分割する。これにより、学部長の名前が複数の学生レコードで重複して格納されるのを防ぎ、学部長が変更された際の更新も容易になる。

「ボイス・コッド正規形(BCNF)」は、3NFのより厳密な形式であり、一部の特殊なケースで3NFでは解決できない問題に対処するために用いられる。BCNFのルールは、「すべての決定子(他の属性の値を一意に決定できる属性)が候補キーであること」を求める。候補キーとは、主キーになりうる属性の集合のことだ。例えば、「学生ID」「コース」「教授」というテーブルがあるとする。もし一人の教授が特定のコースを教えている場合、またそのコースが複数の学生によって受講されている場合、教授がコースを決定し、コースが学生IDの一部ではないという状況が発生しうる。これを解決するためには、「学生ID」と「コース」を持つ「学生コーステーブル」と、「教授」と「コース」を持つ「教授コーステーブル」に分割する。これにより、より厳密な依存関係の整理が可能になる。

さらに高度な正規形として、「第四正規形(4NF)」と「第五正規形(5NF)」がある。 「第四正規形(4NF)」は、BCNFの条件を満たした上で、「多値従属性」を排除する。多値従属性とは、一つの主キーに対して複数の独立した属性が存在し、それぞれが独立して複数の値を持つような状況を指す。例えば、「従業員ID」「スキル」「言語」というテーブルで、一人の従業員が複数のスキルを持ち、また複数の言語を話せるが、スキルと言語の間には直接的な関連がない場合がこれにあたる。この場合、多値従属性によりデータが重複しやすくなる。4NFではこれを解消するため、「従業員ID」と「スキル」を持つ「従業員スキルテーブル」と、「従業員ID」と「言語」を持つ「従業員言語テーブル」に分割する。これにより、独立した関係によるデータ重複を防ぐことができる。

最後に、「第五正規形(5NF)」は「結合従属性」を排除することを目指す。これは、4NFの条件を満たした上で、テーブルが複数の小さなテーブルに分割され、それらすべてを結合することでしか元の情報を完全に復元できないような状況で生じる冗長性を排除する。5NFは、テーブル内のデータがこれ以上分割できない「既約性」を保証し、複数の関係の結合によって生じる冗長性を取り除く。例えば、「サプライヤー」「部品」「プロジェクト」という3つの要素が複雑な関係を持つ場合、これを「サプライヤーと部品」「サプライヤーとプロジェクト」「部品とプロジェクト」というそれぞれの関連を示すテーブルに分割することで、データの冗長性をなくし、整合性を保つことができる。

ここまで正規化について説明したが、場合によっては意図的に正規化のルールを緩める「非正規化」を行うことがある。非正規化とは、データの冗長性をあえて許容し、関連するデータを一つのテーブルにまとめることで、特にデータベースからのデータ読み込み(参照)性能を向上させる手法だ。正規化されたデータベースでは、目的のデータを取得するために複数のテーブルを結合(JOIN)する必要がある場面が多く、これが処理速度の低下を招くことがある。非正規化は、この結合処理を減らすことで、データの取得を高速化する。

非正規化が有効なのは、例えば以下のような場面だ。一つは、データの参照が非常に頻繁に行われ、書き込み(更新)が少ない「リードヘビー」なワークロードを持つシステム、例えばデータ分析用のレポート生成システムやデータウェアハウスなど。二つ目は、複雑な結合処理を減らして、クエリの実行時間を短縮したい場合。三つ目は、リアルタイム性が求められるアプリケーションで、常に高速なデータアクセスが必要な場合である。具体的な例としては、Eコマースの注文履歴を表示する際に、注文IDだけでなく、顧客名や商品名、合計金額といった情報を一つの注文テーブルにまとめておくことで、毎回顧客テーブルや商品テーブルを結合する手間を省き、表示速度を向上させることができる。また、ソーシャルメディアの投稿に付随する「いいね」の数を、投稿テーブルの列として直接保持しておくことで、いいねの数を高速に取得するといった用途も考えられる。

まとめとして、データベース設計において正規化は、データの整合性を確保し、重複を排除し、保守性を高める上で不可欠なプロセスである。通常は、少なくとも第三正規形(3NF)まで正規化を行うことが推奨される。これにより、ほとんどのデータ不整合の問題を回避できる。しかし、厳密な正規化は、特にデータ参照が多いシステムにおいて、複雑な結合処理を増やし、パフォーマンスを低下させる可能性がある。そのため、パフォーマンスが極めて重要な要件となる場合には、データの整合性を損なわない範囲で、戦略的に非正規化を適用することも有効な選択肢となりうる。ベストプラクティスとしては、まずデータの整合性を最優先して正規化を徹底し、その上でシステムのパフォーマンス上のボトルネックが特定された場合にのみ、限定的かつ慎重に非正規化を検討するというアプローチが推奨される。データの正確性とシステム性能のバランスを適切に取ることが、効果的なデータベース設計の鍵となるのだ。

関連コンテンツ

関連ITニュース