初心者向けデータベース設計!第1~第3正規形の基本

データベース設計の基本は、データを無駄なく整理すること。その中でも「正規形」はデータの重複を防ぎ、効率的なシステムを作る上で欠かせない概念です。このブログでは、初心者のために第1正規形から第3正規形までをわかりやすく解説します。実際のプログラムで役立つヒントもお届けしますので、ぜひ最後までお読みください。

1. 正規形とは?

1-1 正規形の基礎知識

正規形とは、データベースのテーブル構造を効率的かつ整然と設計するための規則です。正規形に従うことで、データの重複や矛盾を防ぎ、メンテナンスがしやすいデータベースを構築できます。

一般的には第1正規形から第5正規形までありますが、第3正規形までを押さえておけば、実務としては十分なレベルだと思います。

1-2 データベース設計における正規形の役割

正規形に基づいたデータベース設計は、データの一貫性と整合性を確保し、効率的なクエリパフォーマンスを実現します。また、データの冗長性を最小限に抑えることができるため、ストレージの節約にも繋がります。

2. 第1正規形(1NF)

2-1 第1正規形の定義

第1正規形(1NF)は、各フィールドが原子値(最小単位の値)で構成されていることを意味します。つまり、複数の値が一つのフィールドに含まれていない状態を指します。

2-2 第1正規形の具体例

例えば、以下のような「注文」テーブルを考えてみましょう。

修正前のテーブル:

注文ID顧客名注文商品
1田中太郎商品A, 商品B
2鈴木花子商品C

このテーブルは「注文商品」フィールドに複数の値が含まれているため、第1正規形に違反しています。これを第1正規形に従って修正すると、以下のようになります。

修正後のテーブル:

注文ID顧客名注文商品
1田中太郎商品A
1田中太郎商品B
2鈴木花子商品C

第1正規形の定義と具体例は以上になりますが、リレーショナルデータベースのテーブルは、すべて第1正規形を自動的に満たしているため、あまり考える必要はありません。

3. 第2正規形(2NF)

3-1 第2正規形の定義

第2正規形(2NF)は、第1正規形に準拠した上で、部分関数従属を排除することが求められます。つまり、主キーの一部にのみ依存する非キー属性を分離します。

なぜ第2正規形が必要か?

第1正規形では、まだ主キーの一部分に依存するデータが残っている可能性があり、これがデータの冗長性や一貫性の欠如を引き起こします。例えば、同じデータが複数の行に保存されていると、データを変更する際にすべての行を更新する必要があるため、誤ったデータが混入するリスクが高まります。第2正規形にすることで、これらの問題を防ぎ、データを正確かつ効率的に管理できるようになります。

3-2 第2正規形の具体例

次に「社員プロジェクト」テーブルを見てみましょう。

修正前のテーブル:

社員IDプロジェクトID社員名プロジェクト名
1101田中太郎プロジェクトA
2102鈴木花子プロジェクトB

ここでは、社員名が社員IDにのみ依存しているにもかかわらず、プロジェクト情報と一緒に保存されています。これを第2正規形にするには、社員情報を別のテーブルに分けます。

修正後のテーブル: 社員テーブル:

社員ID社員名
1田中太郎
2鈴木花子

プロジェクトテーブル:

プロジェクトIDプロジェクト名
101プロジェクトA
102プロジェクトB

社員プロジェクトテーブル:

社員IDプロジェクトID
1101
2102

4. 第3正規形(3NF)

4-1 第3正規形の定義

第3正規形(3NF)は、第2正規形に準拠し、推移的関数従属を排除した形です。つまり、非キー属性が他の非キー属性に依存してはならないということです。

なぜ第3正規形が必要か?

第2正規形まででは、まだ非キー属性同士の依存関係が残っている可能性があります。このような依存関係が存在すると、一つの属性を更新した際に、関連する他の属性も変更する必要があり、データの一貫性が保たれなくなります。第3正規形にすることで、データ間の依存関係をより明確にし、誤りが発生する可能性を低減させることができます。特に複雑なデータベースでは、第3正規形にすることで、データの保守と管理が大幅に簡単になります。

4-2 第3正規形の具体例

次に「商品管理」テーブルを考えてみます。

修正前のテーブル:

商品ID商品名仕入先ID仕入先名
1商品A200仕入先X
2商品B201仕入先Y

この場合、仕入先名は仕入先IDに依存しているため、これを別のテーブルに分ける必要があります。

修正後のテーブル: 商品テーブル:

商品ID商品名仕入先ID
1商品A200
2商品B201

仕入先テーブル:

仕入先ID仕入先名
200仕入先X
201仕入先Y

5. 正規形を実際のデータベースで活用する方法

5-1 効率的なデータベース設計

正規形に基づいたデータベース設計は、パフォーマンスとメンテナンスの効率を向上させます。特に大規模なデータベースでは、正規化されたテーブルがクエリの速度を向上させ、エラーの発生を減少させます。

5-2 正規形を実践で使うためのポイント

実際の現場では、正規形に厳密に従うだけでなく、データの使用頻度やパフォーマンスを考慮して、正規形の一部をあえて崩すこともあります。特に、大量のデータを扱う場合やリアルタイム性が求められる場合、冗長なデータを持たせてアクセス速度を優先することが一般的です。

まとめ

正規形はデータベース設計の基礎ですが、実務では状況に応じた柔軟な設計が必要です。このガイドを参考に、効率的なデータベース構築に挑戦してみましょう!