今回はデータベースの正規化について解説をします。
データベースの正規化はデータベースを扱う中で、重要な基礎になりますのでぜひご利用してください。
コンテンツ
データベースの正規化とは
今回はデータベースの正規化について解説します。
正規化とは簡単にいうと「効率よくデータを扱うために整理すること」です。
データを管理する方法はいくつかありますが、世の中で使用されているものは、行(ダブル、レコード)、列(カラム、属性)で主に関係を表現します。こちらは関係データベース(リレーショナルデータベース)といわれています。
冗長なデータがあると、ディスク領域が浪費され保守上の問題点が生じます。複数の場所に存在するデータの変更が必要な場合、すべての場所でそれらのデータが同一になるように変更するよう必要があります。
データベースの正規化にはいくつかの規則があります。それぞれの規則は"正規型"と呼ばれます。最初の規則に従っているデータベースは"第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ゼロからはじめるデータベース操作"で基本をしっかり