Databese

データベースの正規化についてエンジニアが丁寧に解説

今回はデータベースの正規化について解説をします。

データベースの正規化はデータベースを扱う中で、重要な基礎になりますのでぜひご利用してください。

データベースの正規化とは

今回はデータベースの正規化について解説します。

正規化とは簡単にいうと「効率よくデータを扱うために整理すること」です。

データを管理する方法はいくつかありますが、世の中で使用されているものは、行(ダブル、レコード)、列(カラム、属性)で主に関係を表現します。こちらは関係データベース(リレーショナルデータベース)といわれています。

冗長なデータがあると、ディスク領域が浪費され保守上の問題点が生じます。複数の場所に存在するデータの変更が必要な場合、すべての場所でそれらのデータが同一になるように変更するよう必要があります。

データベースの正規化にはいくつかの規則があります。それぞれの規則は"正規型"と呼ばれます。最初の規則に従っているデータベースは"第1正規型"です。最初の3つの規則に従っているデータベースは"第3正規型"です。ほとんどのアプリケーションでは、第3正規型が最も高いレベルとみなされています。

非正規系とは繰り返し項目を含むテーブルのことです。

しかし、OracleなどのRDBで繰り返し項目を含むテーブルを作ることは不可能なので、テーブルは基本的に第1正規系化された状態から始まると思ってください。

正規化の目的

正規化の最大の目的はDB上で扱うデータの重複を排除し、「矛盾」の発生を防ぎます。

「矛盾」とは、例えば組織に所属する社員を管理するテーブルがあるとします。(正規化は不十分である)

社員名 所属部署 部長名
佐山 営業部 塚本
大久保 営業部 塚本
人事部 塩見

ここで異動が発生して、営業部の部長が「菊山」に代わります。

代わった段階で営業部の部長名を全て「菊山」に更新しないと「矛盾」が生じます。

下記の状態ですね。

社員名 所属部署 部長名
佐山 営業部 菊山
大久保 営業部 塚本(更新できてない!)
人事部 塩見

この場合営業部の部長は更新ミスにより、異なる人物となっており矛盾が生じています。

データベースにおいてこのような矛盾は起こりやすいです。

これがデータの重複です。

正規化を行うことでこのようなデータの重複を排除し、矛盾が生じないテーブル設計を行うことができます。

正規化の手順

非正規形

まったく正規化されてない状態であり、繰り返し項目が存在する状態を非正規形と呼びます。これから以下の例を用いて第3正規形までの正規化のプロセスを説明します。

発注番号 取引先コード 取引先名 商品コード1 商品名 商品コード2 商品名
N0901 6509 文具の岡田 3309 ボールペン(黒) 3310 ボールペン(赤)
N0902 6509 文具の岡田 3309 ボールペン(黒) 3311 シャーペン
N0903 6509 文具の岡田 3313 消しゴム 3310 ボールペン(赤)

第1正規形

第1正規形の条件はテーブルで表現できる形になっていることです。つまり1つのカラムに1つの値のみ設定されている状態のことです。

テーブルという形で表現できていれば、第1正規系の条件は満たしているという理解で大丈夫です。

発注番号 取引先コード 取引先名 商品コード 商品名
N0901 6509 文具の岡田 3309 ボールペン(黒)
N0901 6509 文具の岡田 3310 ボールペン(赤)
N0902 6509 文具の岡田 3309 ボールペン(黒)
N0902 6509 文具の岡田 3311 シャーペン
N0903 6509 文具の岡田 3313 消しゴム
N0903 6509 文具の岡田 3310 ボールペン(赤)

非正規形との違いは商品コードが1つにまとまっていることです。

関数従属性

関数従属性はコンピューターの関係データベースにおける関係の2つの属性集合間で、一方の属性集合の値がもう一方の属性集合の値を関数的に決定するという制約です。

第2正規形

第2正規形の条件は、テーブルの全ての候補キーにおいて部分関数従属性が存在しないことです。

以下の表では部分関数従属性をなくすため、「発注」と「商品」を別のテーブルに切り出しています。

発注テーブル(発注番号が主キー)

発注番号 取引先コード 取引先名
N0901 6509 文具の岡田
N0902 6509 文具の岡田
N0903 6509 文具の岡田

発注明細テーブル(発注番号と商品コードキーが主キー)

発注番号 商品コード
N0901 3309
N0901 3310
N0902 3309
N0902 3311
N0903 3313
N0903 3310

商品テーブル(商品コードが主キー)

商品コード 商品名
3309 ボールペン(黒)
3310 ボールペン(赤)
3311 シャーペン
3313 消しゴム

 

部分関数従属性

候補キーの一部に関数従属している状態を部分関数従属といいます。

第3正規形

第3正規形の条件は、テーブル内の非キー→非キー属性の関数従属、つまり推移関数従属性が存在しないことです。

発注テーブル(発注番号が主キー)

発注番号 取引先コード
N0901 6509
N0902 6509
N0903 6509

取引先テーブル(取引先コードが主キー)

取引先コード 取引先名
6509 文具の岡田

発注明細テーブル(発注番号、商品コードが主キー)

発注番号 商品コード
N0901 3309
N0901 3310
N0902 3309
N0902 3311
N0903 3313
N0903 3310

商品テーブル(商品コードが主キー)

商品コード 商品名
3309 ボールペン(黒)
3310 ボールペン(赤)
3311 シャーペン
3313 消しゴム

まとめ

今回はデータベースの正規化について解説しました。

これからデータベースについて本格的に勉強を始めたい方は参考書などで勉強してみるのをおすすめします。

初心者は"マンガでわかるデータベース"でわかりやすく!

 

脱初心者は"SQLゼロからはじめるデータベース操作"で基本をしっかり