データベースの正規化方法とは?初心者でも理解できる簡単な手順と具体例

エンジニア

データベース設計で重要な「正規化」。

効率的で冗長性の少ないデータベースを作成するための基本ですが、初めて学ぶ人には難解に感じられることもあります。

本記事では、正規化の目的やメリットを解説し、具体例を用いながら第1正規形から第3正規形までのステップをわかりやすく説明します。

この記事を読めば、正規化の基本をしっかり理解し、実践できるようになります!


この記事を書いた人

新卒でIT業界に入社し現在30歳。新卒でエンジニア、転職を経てIT業界向けのキャリアアドバイザーを経験。現在はITコンサルタントとして日々精進。幅広い職種でIT業界に携わった経験を活かして、IT業界に関する情報を楽しくわかりやすくをモットーに発信中。

shiiimoをフォローする
  1. 正規化とは?その目的と重要性
    1. 正規化で解決できる具体的な問題
    2. 正規化の重要性
  2. 正規化を始める前に:データベース設計の基本
    1. データベース設計の基本概念
    2. 主キーと外部キーの役割
    3. スキーマ設計の考慮事項
    4. 正規化準備としてのデータ整理
    5. 正規化の土台を作る
  3. 第1正規形(1NF)の手順と例
    1. 第1正規形(1NF)とは?
    2. 1NFに正規化する手順
    3. 実際の例で理解する
      1. 1NFへの変換プロセス
    4. 1NFを適用するメリット
  4. 第2正規形(2NF)の手順と例
    1. 第2正規形(2NF)とは?
    2. 部分関数従属の問題とは?
    3. 2NFに正規化する手順
    4. 実際の例で理解する
      1. 2NFに変換する
    5. 2NFを適用するメリット
  5. 第3正規形(3NF)の手順と例
    1. 第3正規形(3NF)とは?
    2. 推移的関数従属の問題とは?
    3. 3NFに正規化する手順
    4. 実際の例で理解する
      1. 3NFへの変換
    5. 3NFを適用するメリット
  6. 正規化のメリットとデメリット
    1. 正規化のメリット
      1. データの冗長性が減少する
      2. データの整合性と一貫性が向上する
      3. データ更新が簡単になる(更新異常の防止)
      4. データ削除時の異常が防止される
    2. 正規化のデメリット
      1. クエリの複雑化
      2. パフォーマンスの低下
      3. 小規模システムでは過剰設計になる
    3. 正規化を実践する際の注意点
  7. よくある質問(FAQ)
    1. Q1: 正規化と非正規化の違いは何ですか?
    2. Q2: 正規化はどこまで行えば良いのですか?
    3. Q3: 正規化の理解を深めるおすすめの参考書は?
  8. まとめ

正規化とは?その目的と重要性

キーボードと色鉛筆

データベースの正規化とは、データの整理整頓を行い、効率的で一貫性のあるデータベース構造を設計するプロセスです。

特に、大量のデータを扱うシステムでは、正規化を適切に行うことで以下のような問題を解決できます。

  • 冗長性の排除:データの重複を減らし、ストレージの無駄を削減する。
  • データの整合性向上:一箇所を更新するだけで全体のデータが一致する。
  • 保守性の向上:データの追加や変更、削除が簡単に行えるようになる。

正規化の主な目的は、データの「重複」と「矛盾」を防ぎ、効率的なデータ管理を実現することです。

これにより、システムのパフォーマンスや可用性が向上し、長期的な運用コストも削減できます。

正規化で解決できる具体的な問題

例えば、小さな規模のテーブルでは冗長性を感じにくいかもしれませんが、企業規模でデータを扱う場合には深刻な問題となります。以下に簡単な例を挙げます。

例:顧客情報テーブル

顧客ID 顧客名 商品名 商品価格 購入日
001 山田太郎 パソコン 120,000 2023-12-01
002 田中花子 スマホ 80,000 2023-12-03
001 山田太郎 スマホ 80,000 2023-12-05

このテーブルでは、山田太郎さんの情報が繰り返し記載されています。これにより以下のような問題が発生します。

  • データの冗長性:同じ顧客情報が繰り返され、データ量が増加。
  • 更新時の整合性問題:顧客名を変更する際、全ての行を修正する必要がある。
  • 管理の複雑化:データが増えるほどエラーが発生しやすくなる。

正規化を適用すれば、顧客情報と購入履歴を別々のテーブルに分割することで、こうした問題を解決できます。

正規化の重要性

正規化は特に以下のような状況で大きな効果を発揮します。

  1. 大量のデータを扱う場合
    複数の部門がアクセスする大規模システムでは、データが分散して管理されると矛盾が生じやすくなります。正規化を行うことで、データが統一的に管理され、業務効率が向上します。
  2. 頻繁に更新が必要な場合
    データの更新頻度が高いシステムでは、冗長性があると更新箇所が増え、手間やミスが発生しやすくなります。正規化はこれを防ぎます。
  3. レポートや分析が求められる場合
    正確なデータに基づいた意思決定が必要な場面では、整然としたデータ構造が重要です。正規化によりデータの信頼性が向上します。

正規化を始める前に:データベース設計の基本

本がたくさん

正規化をスムーズに理解し、活用するためには、データベース設計の基本を押さえておくことが重要です。

このセクションでは、データベース設計において最初に知っておきたい要素や考え方を説明します。

正規化は、設計の中の一部分に過ぎません。全体を把握することで、効率的かつ柔軟性の高いデータベースを作る土台ができます。

データベース設計の基本概念

データベース設計は、大きく以下のステップで進められます。

  1. 要求定義
    • どんなデータを管理し、どのように利用するのかを明確にします。たとえば、「顧客管理システム」なら、顧客情報(氏名、住所、電話番号)や購入履歴が必要になるかもしれません。
  2. データモデルの設計
    • データの構造を視覚的に表現した「ER図(エンティティ・リレーションシップ図)」を作成します。これにより、データの関係性を可視化できます。
  3. テーブルの作成
    • ER図に基づき、具体的なテーブル構造を設計します。ここで、正規化の手法が活躍します。

主キーと外部キーの役割

データベース設計の基本要素として、「主キー(Primary Key)」と「外部キー(Foreign Key)」の理解が欠かせません。

  • 主キー
    各行を一意に識別するための列です。たとえば、顧客テーブルでは「顧客ID」が主キーになります。主キーの役割は、データをユニークに管理することです。
  • 外部キー
    他のテーブルの主キーを参照する列です。外部キーを設定することで、異なるテーブル間の関連性を保ちながら、整合性を維持できます。

例:顧客テーブルと注文テーブル

顧客テーブル 注文テーブル
顧客ID(主キー) 顧客名 注文ID(主キー)
001 山田太郎 1001(注文ID)
002 田中花子 顧客ID(外部キー)

ここで、注文テーブルの「顧客ID」は顧客テーブルの「主キー」を参照する外部キーです。この関連性により、「どの顧客がどの注文をしたか」を簡単に追跡できます。

スキーマ設計の考慮事項

スキーマ設計とは、データベース全体の構造を計画する作業を指します。以下のポイントを考慮することで、実用的な設計が可能になります。

  • データの一貫性
    各テーブルが意味のあるデータを管理するように設計します。たとえば、「顧客名」を注文テーブルに記録するのではなく、顧客テーブルに集約します。
  • データのスケーラビリティ
    将来的にデータ量が増えたり、新しい種類のデータが追加される可能性を考慮します。
  • パフォーマンス
    読み取りや書き込みの頻度を予測し、テーブルやインデックスを適切に設計します。

正規化準備としてのデータ整理

正規化に進む前に、以下の点を確認しましょう。

  1. データの重複チェック
    重複データがどこに存在するかを洗い出します。
  2. データ依存性の理解
    各列の間にどのような関係があるのかを分析します。
  3. 実際のデータ例を検討
    実際に使用するデータを想定しながら、設計が現実的かどうかを確認します。

正規化の土台を作る

例えば、以下のような状況があるとしましょう。

例:非正規化の状態

顧客ID 顧客名 商品名 商品カテゴリ 購入日
001 山田太郎 パソコン 電化製品 2023-12-01
002 田中花子 スマホ 電化製品 2023-12-03
001 山田太郎 スマホ 電化製品 2023-12-05

このテーブルでは、顧客情報や商品情報が繰り返されています。正規化を進める前に、各列がどのデータと依存関係にあるのかを整理することが必要です。


第1正規形(1NF)の手順と例

階段を上る人

第1正規形(1NF)は、正規化の最初のステップです。

この段階では、データベース内の各テーブルを整理し、構造を改善します。1NFを適用することで、データがより扱いやすく、効率的になります。


第1正規形(1NF)とは?

第1正規形では、以下の条件を満たすようにテーブルを整理します。

  1. すべての列が単一の値を持つ:各セルには単一の値が含まれ、リストや複数の値が許されません。
  2. 各行が一意に識別される:重複した行がなく、主キーが定義されています。

これにより、データが「一意で」「明確」に管理される状態を作り出します。


1NFに正規化する手順

1NFへの変換は次の3つのステップで進めます。

  1. 複数の値を含む列を特定する
    テーブルの中で、一つのセルに複数の値が含まれている箇所を探します。たとえば、商品名や購入日がリスト形式で記載されている場合、それらが対象となります。
  2. データを分割して単一の値にする
    リストや複数の値を行ごとに分割します。これにより、各セルが単一の値のみを持つようになります。
  3. 主キーを設定する
    各行を一意に識別するために主キーを設定します。

実際の例で理解する

以下に非正規化の例を示します。このテーブルでは、顧客が購入した複数の商品名が一つのセルにリスト形式で記載されています。

非正規化のテーブル例

顧客ID 顧客名 商品名 購入日
001 山田太郎 パソコン, スマホ 2023-12-01, 2023-12-05
002 田中花子 スマホ 2023-12-03

1NFへの変換プロセス

  1. 複数の値を持つ列を特定
    上記のテーブルでは、「商品名」と「購入日」が複数の値を含んでいるため、分割の対象となります。
  2. 単一の値に分割
    各商品と購入日を別々の行に分けます。
  3. 主キーの設定
    各行を一意に識別するために、主キーとして「顧客ID」と「商品名」の組み合わせを使用するか、新たに「注文ID」を作成して一意の識別子を追加することが考えられます。

1NFに変換後のテーブル

顧客ID 顧客名 商品名 購入日
001 山田太郎 パソコン 2023-12-01
001 山田太郎 スマホ 2023-12-05
002 田中花子 スマホ 2023-12-03

注文IDを追加した例

注文ID 顧客ID 顧客名 商品名 購入日
1001 001 山田太郎 パソコン 2023-12-01
1002 001 山田太郎 スマホ 2023-12-05
1003 002 田中花子 スマホ 2023-12-03

1NFを適用するメリット

1NFを適用することで得られる主なメリットは次のとおりです。

  1. データの冗長性を減らす
    一つのセルに複数の値を含む場合、それぞれを分離することでデータの重複を防ぎます。
  2. クエリが簡単になる
    例えば、「2023-12-01に購入された商品を検索する」といったクエリが簡単に記述可能になります。
  3. データの整合性が向上
    一つのデータ変更がテーブル全体に矛盾を引き起こす可能性を低減します。

第2正規形(2NF)の手順と例

階段上る人2

第1正規形(1NF)でデータを整理した次のステップは、第2正規形(2NF)への変換です。

2NFは、データのさらなる効率化と整合性の向上を目指します。

特に、複合主キーを持つテーブルにおいて「部分関数従属」の問題を解消することが目的です。


第2正規形(2NF)とは?

2NFは、以下の条件を満たす必要があります。

  1. 1NFの条件を満たしていること
    2NFは、1NFであることが前提です。
  2. 主キーのすべての属性に完全に依存していること
    主キーの一部にしか依存しない(部分関数従属)列がある場合、それらを分離する必要があります。

部分関数従属の問題とは?

部分関数従属とは、複合主キーの「一部」にだけ依存する列が存在する状態を指します。この状態が続くと、以下の問題が発生します。

  • データの冗長性
    主キーの一部に依存する情報が繰り返し記録される。
  • データ更新時の不整合
    データを更新する際に、複数箇所を同時に修正しなければならない。

2NFに正規化する手順

2NFへの変換は以下の3ステップで進めます。

  1. 部分関数従属を特定する
    複合主キーを持つテーブルを分析し、どの列が主キー全体ではなく一部にしか依存していないかを特定します。
  2. 部分関数従属の列を分離する
    部分関数従属の列を独立したテーブルに分け、それぞれに新しい主キーを設定します。
  3. 適切な外部キーで関連付けを行う
    分離したテーブル同士の関係性を維持するために、外部キーを設定します。

実際の例で理解する

以下に、1NFまで正規化されたテーブルを例として示します。このテーブルは、商品がどの店舗で販売されているかを記録しています。

1NFのテーブル例

店舗ID 商品ID 商品名 店舗名
001 A101 パソコン 東京店
001 B202 スマホ 東京店
002 A101 パソコン 大阪店

2NFに変換する

部分関数従属を解消するために、以下の手順を実施します。

  1. テーブルを分割する
    「店舗ID」と「店舗名」を分離して新しいテーブルを作成します。
  2. 外部キーを設定する
    「商品テーブル」の「店舗ID」を「店舗テーブル」の主キーとして参照する外部キーに設定します。

店舗テーブル

店舗ID 店舗名
001 東京店
002 大阪店

商品テーブル

店舗ID 商品ID 商品名
001 A101 パソコン
001 B202 スマホ
002 A101 パソコン

 

2NFを適用するメリット

2NFにすることで以下のメリットが得られます。

  1. データの冗長性が減少
    「東京店」という情報が複数行に記録されることを防げます。
  2. データの整合性が向上
    「東京店」を「東京本店」に変更したい場合、1か所を修正すればよくなります。
  3. 管理の効率化
    テーブルが分割され、各テーブルが特定の情報のみを管理するため、クエリの対象が明確になります。

第3正規形(3NF)の手順と例

夕日の男

第3正規形(3NF)は、データベース正規化の中でも重要なステップです。

1NFと2NFを満たした上で、さらにデータの整合性を高めるために「推移的関数従属」を取り除くことが目的です。

3NFを適用することで、冗長なデータをさらに減らし、更新時の一貫性を確保できます。


第3正規形(3NF)とは?

3NFを満たすためには、以下の条件を満たす必要があります。

  1. 2NFを満たしていること
    3NFは、2NFであることが前提です。
  2. 推移的関数従属が存在しないこと
    推移的関数従属とは、ある列が主キーに直接依存していないが、別の列を経由して間接的に依存している状態を指します。この問題を解消するため、関連する列を分割します。

推移的関数従属の問題とは?

推移的関数従属があると、以下の問題が発生します。

  • データの冗長性
    同じ情報が複数の行に繰り返し記録されます。
  • 更新時の不整合
    例えば、一部の行だけ更新され、データの矛盾が生じる可能性があります。
  • 削除時の不整合
    不要なデータ削除時に、他の関連情報も失われるリスクがあります。

3NFに正規化する手順

以下の手順で3NFを適用します。

  1. 推移的関数従属を特定する
    主キーに直接依存しない列がある場合、それを見つけます。
  2. 推移的関数従属を解消する
    主キーに間接的に依存している列を分割して新しいテーブルを作成します。
  3. 新しい主キーと外部キーを設定する
    分割されたテーブルを関連付けるために、適切なキーを設定します。

実際の例で理解する

以下に、2NFまで正規化されたテーブルを例として示します。このテーブルでは、従業員情報と部門情報が同じテーブルに含まれています。

2NFのテーブル例

従業員ID 従業員名 部門ID 部門名 部門所在地
E001 山田太郎 D101 営業部 東京
E002 田中花子 D102 開発部 大阪
E003 鈴木一郎 D101 営業部 東京

3NFへの変換

推移的関数従属を解消するために、以下の手順を実施します。

  1. テーブルを分割する
    「部門ID」「部門名」「部門所在地」を別のテーブルとして切り出します。
  2. 外部キーを設定する
    「従業員テーブル」の「部門ID」を「部門テーブル」の主キーに関連付ける外部キーとして設定します。

従業員テーブル

従業員ID 従業員名 部門ID
E001 山田太郎 D101
E002 田中花子 D102
E003 鈴木一郎 D101

部門テーブル

部門ID 部門名 部門所在地
D101 営業部 東京
D102 開発部 大阪

 

3NFを適用するメリット

3NFにすることで得られるメリットは次のとおりです。

  1. データの冗長性がさらに低減
    部門名や部門所在地が繰り返し記録されることを防げます。
  2. データ更新の効率化
    部門名を変更したい場合、部門テーブル内の1箇所を更新するだけで済みます。
  3. データの整合性向上
    更新や削除時の不整合が発生しにくくなります。
  4. クエリが効率化される
    明確に分割されたデータ構造により、必要な情報を簡単に取得できます。

正規化のメリットとデメリット

ペンが置かれた紙

データベースの正規化は、設計を論理的に整理し、データの一貫性や効率を向上させるための重要な手法です。

しかし、すべての状況で正規化が最適というわけではありません。ここでは、正規化のメリットとデメリットを具体例を交えながら解説します。


正規化のメリット

正規化のメリットは以下。

データの冗長性が減少する

重複データを排除することで、ストレージ容量を節約し、データ更新時の手間を軽減します。

具体例
正規化前のテーブルで、同じ顧客の情報(名前や住所)が複数行に記録されていた場合、住所を変更する際にすべての行を修正しなければなりません。正規化後は顧客情報が独立したテーブルに分離されるため、1箇所を修正するだけで済みます。


データの整合性と一貫性が向上する

冗長性の削減により、データの矛盾やエラーが発生しにくくなります。

具体例
社員情報を管理するテーブルで、同じ社員の「所属部署」が異なる行で異なる値になっている場合、正規化により所属部署が別テーブルに分離されることで、このような矛盾が防止されます。


データ更新が簡単になる(更新異常の防止)

更新異常とは、データの一部を変更した際に矛盾が生じる問題です。正規化により、このリスクが大幅に低減します。

具体例
商品情報と仕入れ先情報が1つのテーブルにある場合、仕入れ先の住所を更新するたびに複数行を変更する必要があります。正規化により、仕入れ先情報が独立すれば、この問題は解消されます。


データ削除時の異常が防止される

正規化により、不要なデータを削除する際に関連情報が誤って消失するリスクが軽減されます。

具体例
注文履歴と顧客情報が同じテーブルに含まれている場合、注文データを削除すると顧客情報も失われる可能性があります。正規化により、これらのデータを独立させることで、誤った削除を防げます。


正規化のデメリット

正規化のデメリットは以下。

クエリの複雑化

テーブルが細分化されるため、データを取得する際に結合(JOIN)が必要となり、SQL文が複雑になります。

具体例
商品情報を取得する際に、商品テーブル、仕入れ先テーブル、カテゴリテーブルの3つを結合しなければならない場合があります。結合が増えるほど、パフォーマンスが低下する可能性があります。


パフォーマンスの低下

データ取得時に複数テーブルを結合する処理が増えるため、大規模なデータベースでは応答速度が遅くなることがあります。

解決策
高速なデータ取得が求められる場合、正規化を緩和して冗長性を許容する「逆正規化」や、頻繁に利用されるデータをキャッシュする方法が採用されます。


小規模システムでは過剰設計になる

正規化が必ずしも有効とは限らず、特に小規模なシステムやシンプルな用途では、テーブル分割による効果が薄く、逆に管理が複雑になることがあります。

具体例
社員が10人程度の社内用データベースでは、すべての正規化を行うよりも単一のテーブルで管理したほうがシンプルで実用的です。


正規化を実践する際の注意点

  • 業務要件に応じたバランスを取る
    データの一貫性を重視する場合は正規化を進め、応答速度を優先する場合は逆正規化も検討します。
  • 必要に応じて逆正規化を採用する
    例えば、データ分析やレポート作成のためのデータベースでは、逆正規化によりアクセス速度を向上させる場合があります。
  • 物理設計での調整を検討する
    論理的な正規化設計に基づいて、インデックスの追加やキャッシュの利用などでパフォーマンスを補強することが重要です。

よくある質問(FAQ)

Q1: 正規化と非正規化の違いは何ですか?

A:
正規化と非正規化はデータベース設計において対照的なアプローチです。それぞれの特徴と使いどころを以下にまとめます。

  • 正規化
    • 目的: データの冗長性を減らし、整合性を高めること。
    • 手法: テーブルを細分化し、関連データを別々のテーブルに分割します。
    • メリット: データの一貫性が向上し、更新や削除時の異常を防止できます。
    • デメリット: クエリが複雑化し、データ取得時のパフォーマンスが低下する場合があります。
  • 非正規化
    • 目的: データアクセスの速度向上やシステム全体のパフォーマンス向上。
    • 手法: 正規化で分割したテーブルを再統合し、一部の冗長性を許容します。
    • メリット: データ取得がシンプルで高速化されます。
    • デメリット: 冗長性が増えるため、更新や削除時の一貫性を保つのが難しくなることがあります。

Q2: 正規化はどこまで行えば良いのですか?

A:
正規化の適用範囲は、システムの規模や目的によって異なります。一般的には、第3正規形(3NF)まで行えば、十分に冗長性を減らしつつ、実用的なデータ構造を構築できます。ただし、次のポイントを考慮して判断するのが重要です。

  1. システムの規模
    • 小規模なシステムでは、第2正規形(2NF)程度で十分な場合があります。
    • 大規模で複雑なシステムでは、第3正規形以上やボイスコットキー正規形(BCNF)の適用が求められることもあります。
  2. データ更新の頻度
    • 更新が頻繁な場合は、正規化を進めてデータの一貫性を優先するべきです。
    • 更新頻度が低く、読み取り速度が重要な場合は、正規化を緩めることも検討します。
  3. クエリのパフォーマンス
    • 実運用でのデータアクセス速度をテストし、必要に応じて逆正規化で調整します。

Q3: 正規化の理解を深めるおすすめの参考書は?

A:
正規化の基本から応用までを学ぶためには、以下の参考書やリソースがおすすめです。

  1. リレーショナルデータベース入門
    著者: エルウッド・N・サターフィールド
    正規化やデータベース設計の基本を学ぶのに最適な一冊。初心者から中級者向けの内容です。
  2. データベース実践講座
    著者: 佐藤翔太
    実務での正規化やデータベース運用にフォーカスした実践的なガイドブックです。
  3. オンラインリソース: W3Schoolsのデータベースチュートリアル
    正規化の基本概念が図解とともに簡潔に説明されています。実際の例を使った解説が充実しているため、初学者におすすめです。

まとめ

データベースの正規化は、効率的で整合性のある設計をするために不可欠なプロセスです。

本記事で紹介した手順と具体例を参考に、自身のデータベース設計に正規化を取り入れましょう!

次のステップとして、実践練習や高度な設計技術を学ぶことをおすすめします。

エンジニアの基礎を知りたい!という方はこちら!

コメント

タイトルとURLをコピーしました