RDBにおける正規化

1.データベースとは

  • 構造化されたデータの集まり
  • 必要に応じてデータを取得、更新、削除できる
  • 例)スーパーの購入履歴に関するデータベース
購入ID 購入日   購入者名  購入者連絡先          購入品目カテゴリ  単価数量合計金額支払い方法     
12025-06-01山田太郎yamada@data.comボールペン文房具1502300クレジットカード
22025-06-01山田太郎yamada@data.com洗剤掃除用品3001300クレジットカード
32025-06-02佐藤花子sato@data.com牛肉食品100011000現金
42025-06-03山田太郎yamada@data.comカップ麺食品2003600クレジットカード
52025-06-04鈴木一郎suzuki@data.com生活用品7001700PayPay
62025-06-04鈴木一郎suzuki@data.comスケッチブック文房具8001800PayPay

1-1.データベースに関する基礎用語

  • テーブル(Table):表のこと。購入履歴テーブル。
  • カラム(Column):列のこと。購入日、購入品目がカラムに該当する。フィールド、属性ともいう。
  • レコード(Record):行のこと。カラムの情報を揃えたデータの一群。タプルともいう。

1-2.データを単一のテーブルで管理することの問題点

  • 冗長性の増加:同じデータを何度も保存する必要がある
    • ディスク容量の無駄遣い、入力の手間
  • 整合性の低下:変更があったときに関連する箇所を全て変更する必要がある
    • データ操作ミスの誘発、入力の手間
  • 検索・分析が困難:情報を抽出する際に不要なデータを一緒に取得してしまう
    • 処理の膨大化、クエリの複雑化

2.リレーショナルデータベース(RDB)とは

  • 複数のテーブルが互いに関連し合うデータベース
    • データは意味のある単位でテーブルに分割される

2-1.RDBを採用することのメリット

  • 冗長性の排除:同じ情報を複数の場所に重複して持たない
  • 整合性の維持:データの変更があったときに、関連するデータの一貫性を保ちやすい
  • 柔軟なデータ検索:関連するテーブルを結合することで複雑な条件でのデータ抽出が容易になる

2-2.キー

  • データベースのテーブル内で特定の役割を持つカラム

代表的なキーの種類

主キー:レコードを識別するキー

  • 主キーが満たす必要のある条件
    • 一意制約:重複する値を格納できない
    • 非NULL制約:NULL(値がない状態)を格納できない
  • スーパーの購入履歴の例だと購入IDが主キーとなり得る

複合キー:複数のカラムの組み合わせによってレコードを識別するキー

  • 例)学生の受講履歴テーブル
    • 学生IDと講座IDでレコードを識別できる
学生ID講座ID受講日成績
S001C1012025-04-01A
S001C1022025-04-10B
S002C1012025-04-05C
S003C1012025-05-01B

■外部キー:テーブル間の関連を定義するキー

  • 例)学生テーブル
    • 受講履歴テーブルの学生IDは学生テーブルのIDを参照しており外部キーとなる
    • 基本的には外部キーは参照先のテーブルの主キーと一致させる
学生ID学生名生年月日連絡先
S001山田 太郎2005-01-15yamada@data.com
S002田中 花子2004-07-22tanaka@data.com
S003佐藤 健太2006-03-08sato@data.com

2-2.正規化

  • データベースのテーブルをより良い構造にするために分割すること
  • データベースにおける冗長性の排除、整合性の保持、更新異常の防止を目的とした手段
  • 正規化には段階があり、一般的には第3正規形(3NF)まで正規化されていれば良いとされている

2-2-1.第1正規形(1NF)

1NFの条件

  • テーブル内の各セルが単一の値を持つ(リスト形式などになっていない)
  • レコードを一意に識別できるカラム(主キー)が存在している

1NF化の例

  • 1NFを満たしていないテーブル
    • 注文商品が複数入っているセルがある
    • 主キーとなり得るカラムがない
顧客ID顧客名注文日注文商品数量単価
C_001山田太郎2025-05-20りんご, みかん2, 1150, 100
C_002佐藤花子2025-05-21バナナ380
C_001山田太郎2025-05-22ぶどう, いちご1, 2500, 300
  • 1NFを満たしたテーブル
    • 複数の値を持つセルがなくなった
    • 注文IDと注文商品で複合キー(複合主キー)となる
注文ID顧客ID顧客名注文日注文商品数量単価
O_001C_001山田太郎2025-05-20りんご2150
O_001C_001山田太郎2025-05-20みかん1100
O_002C_002佐藤花子2025-05-21バナナ380
O_003C_001山田太郎2025-05-22ぶどう1500
O_003C_001山田太郎2025-05-22いちご2300

2-2-2.第2正規形(2NF)

2NFの条件

  • 1NFの条件を満たす
  • 部分関数従属の排除

関数従属について

  • 関数従属:あるカラムAの値が決まれば別のカラムBの値が決まる状態のこと
    • たとえば、学生テーブルにおいて、学生名がわかれば生年月日がわかる
  • 部分関数従属:複合主キーにおいて、キーでないカラムが主キーの一部にのみ関数従属している状態のこと
    • たとえば、1NFテーブル(注文IDと注文商品が複合キー)において、
      • 注文IDがわかれば顧客名がわかる
      • 注文IDがわかれば注文日がわかる
      • 注文商品がわかれば単価がわかる

2NF化の例(1NFテーブルの変換)

  • 注文テーブル(主キーは注文ID)
注文ID顧客ID顧客名注文日
O_001C_001山田太郎2025-05-20
O_002C_002佐藤花子2025-05-21
O_003C_001山田太郎2025-05-22
  • 商品テーブル(主キーは注文商品)
注文商品単価
りんご150
みかん100
バナナ80
ぶどう500
いちご300
  • 注文詳細テーブル(主キーは注文IDと注文商品の複合キー)
注文ID注文商品数量
O_001りんご2
O_001みかん1
O_002バナナ3
O_003ぶどう1
O_003いちご2

2-2-3.第3正規形(3NF)

3NFの条件

  • 2NFを満たす
  • 推移的関数従属の排除

推移的関数従属とは

  • あるテーブルにおいて、カラムA, B, Cが存在し、Aの値が決まればBの値が決まる、かつBの値が決まればCの値が決まる状態のこと
  • AとBの間、BとCの間の両方に関数従属が成り立つときAとCの間に推移的関数従属が成り立つ

3NF化の例

  • 注文テーブルにおいて、
    • 注文IDが決まれば顧客IDが決まる
    • 顧客IDが決まれば顧客名が決まる
  • 修正後の注文テーブル
注文ID     顧客ID      注文日     
O_001C_0012025-05-20
O_002C_0022025-05-21
O_003C_0012025-05-22
  • 顧客テーブル
顧客ID     顧客名      
C_001山田太郎
C_002佐藤花子

3.まとめ

  • 複数のテーブルが関係しあっているデータベースをリレーショナルデータベース(RDB)という
  • RDBにおいて、特別な役割を果たすカラムのことをキーという
  • RDBをうまく使いこなすためにはテーブルを正しく分割する正規化が重要

4.参考

Qiita
分かりやすく正規化について理解しよう (データベース) - Qiita データベースの正規化についてわかりやすく理解しよう データベースの正規化とは?? データベースの正規化とは、データの整合性を確保するために必要な手法です。データの...
あわせて読みたい