RAKUS Developers Blog | ラクス エンジニアブログ

株式会社ラクスのITエンジニアによる技術ブログです。

正規化とは【データベース】

はじめに

こんにちは。
開発課のmoryosukeです。
OSS-DBの勉強をする過程で第二、第三正規形ってどんなことするんだっけ?そもそも部分関数従属、推移関数従属ってなんだっけ?と混乱することが多くありました。同じような方がいらっしゃいましたらぜひ参考にしてみてください。

目次

正規形とは

データの重複をなくし整合的にデータを取り扱えるようにデータベースを設計することを、データベースの正規化と呼びます。
正規化を行っておくと、データの追加・更新・削除などに伴うデータの不整合や喪失が起きるのを防ぎ、メンテナンスの効率を高めることができます。
正規化には第一正規形から第五正規形がありますが、ほとんどの場合は第三正規化まで行えば、実務上は問題ないとされています。
そのため、ここでは、第三正規形までを紹介いたします。

非正規形

非正規系は正規化されていないデータです。

非正規形
注文番号 顧客ID 顧客名 電話番号 商品ID 商品名 単価 数量 金額
0001 0001 田中 000-0000-0000 0001 マルゲリータ 1,200 2 2,400
0002 てりやき 1,000 1 1,000

第一正規形

第一正規化は、非正規形のテーブルに次の作業を行います。

  1. 主キーを設定する
  2. 繰り返し現れる列のデータをグループ化して、別のテーブルに切り離す
  3. 導出項目(他の属性から算出できる項目)を削除する

今回の場合

  1. 注文番号を主キーとして設定します。
  2. 非正規系のテーブルから繰り返し現れる列を切り離し、下記のような「注文明細テーブル」にします。
  3. 金額は、単価✕数量から算出できる導出項目であるため、削除します。

注文テーブル
注文番号
(主キー)
顧客ID 顧客名 電話番号
0001 0001 田中 000-0000-0000
注文明細テーブル
注文番号
(主キー)
商品ID
(主キー)
商品名 単価 数量
0001 0001 マルゲリータ 1,200 2
0001 0002 てりやき 1,000 1

第二正規形

第二正規形は、第一正規型のテーブルから部分関数従属属性であるものを除きます。

部分関数従属
まず、関数従属とは「ある属性(列)の値Xが決まると、別の属性の値Yが自動的に決まる」という関係です。
そして、部分関数従属は、「XがABからなる場合、AまたはBが決まるとYが決まる」という関係です。
今回の場合、注文明細テーブルの複合主キーの一部である商品IDが決まれば商品名と単価が決まる、部分関数従属となっています。

つまり、複合主キーの一部の列の値から導き出せる列があれば、それらを別のテーブルに分割するということです。
よって、以下の手順で第二正規化が行なえます。

  1. 商品名と単価は、第一正規形の注文明細テーブルの複合主キーの一部である商品IDにより決まる部分関数従属であるため、商品IDだけを主キーとして「商品ID→商品名、単価」となるように、「商品テーブル」に分割する
  2. 「商品テーブル」と「注文明細テーブル」を関連付けられるように、「注文明細テーブル」のIDは、「商品テーブル」を参照する外部キーとして設定する

注文テーブル
注文番号
(主キー)
顧客ID 顧客名 電話番号
0001 0001 田中 000-0000-0000
注文明細テーブル
注文番号
(主キー)
商品ID
(主キー・外部キー)
数量
0001 0001 2
0001 0002 1
商品テーブル
商品ID
(主キー)
商品名 単価
0001 マルゲリータ 1,200
0002 てりやき 1,000

第三正規形

第三正規化は、第二正規形から推移従属属性であるものを除きます。

推移関数従属
主キー以外の項目に従属する関係のことで、 「主キーXが決まるとYが決まり、Yが決まるとZが決まる」という関係です。
今回の場合、注文テーブルの非キー属性である顧客IDが決まると、顧客名、電話番号が決まるという関係を指します。

つまり、上記 推移関数従属部分を、顧客IDを主キーとした顧客テーブルに分割することによって、第三正規形となります。顧客テーブルと注文テーブルを関連付けられるように、注文テーブルの顧客IDは、顧客テーブルを参照する外部キーとして設定します。
注文明細テーブルと商品テーブルは、第二正規化からそのままです。

注文テーブル
注文番号
(主キー)
顧客ID
(外部キー)
0001 0001
顧客テーブル
顧客ID
(主キー)
顧客名 電話番号
0001 田中 000-0000-0000

まとめ

当初1つのテーブルだったものを正規化を行うことで以下の4つのテーブルに整理されました。
注文明細テーブル
注文番号
(主キー)
商品ID
(主キー・外部キー)
数量
0001 0001 2
0001 0002 1
商品テーブル
商品ID
(主キー)
商品名 単価
0001 マルゲリータ 1,200
0002 てりやき 1,000
注文テーブル
注文番号
(主キー)
顧客ID
(外部キー)
0001 0001
顧客テーブル
顧客ID
(主キー)
顧客名 電話番号
0001 田中 000-0000-0000


エンジニア中途採用サイト
ラクスでは、エンジニア・デザイナーの中途採用を積極的に行っております!
ご興味ありましたら是非ご確認をお願いします。
20210916153018
https://career-recruit.rakus.co.jp/career_engineer/

カジュアル面談お申込みフォーム
どの職種に応募すれば良いかわからないという方は、カジュアル面談も随時行っております。
以下フォームよりお申込みください。
rakus.hubspotpagebuilder.com

ラクスDevelopers登録フォーム
20220701175429
https://career-recruit.rakus.co.jp/career_engineer/form_rakusdev/

イベント情報
会社の雰囲気を知りたい方は、毎週開催しているイベントにご参加ください!

◆TECH PLAY
techplay.jp

◆connpass
rakus.connpass.com

Copyright © RAKUS Co., Ltd. All rights reserved.