データベース

正規化入門#02(第1正規形)

こんにちは、cocomaruです。

前回の続編になりますが、今回は正規形の1つである第1正規形について説明します。

第1正規形とは

まず定義については次の通りです。

第1正規形の定義

関係(テーブル)の属性が全て、単一値である。

単一値をとるとは、属性はシンプルな値であると言うことであり、これは直積集合べき集合を排除することでもあります。

…言葉だけだと難しいので、表を用いて説明します!

非正規形の状態

まず正規化されていない状態、つまり非正規化の状態である表を定義していきましょう。

次のような関係(受講講座)を考えます。

・関係(受講講座)

受講コード 受講日 学生名(学生コード) 講座コード 講座名 受講料 受講数 支払合計
1001 2019-04-01 山田(S001) C001 数学 5,000 3 15,000
C002 国語 5,000 2 10,000
1002 2019-04-01 佐藤(S002) C001 数学 5,000 1 5,000
C003 英語 8,000 2 16,000
C005 社会 4,000 1 4,000
1003 2019-04-01 鈴木(S003) C004 理科 6,000 3 18,000
1004 2019-05-30 鈴木(S003) C005 社会 4,000 4 16,000

第1正規形を行う

定義した関係(受講講座)は非正規形であるので、ここから第1正規形にしていきたいと思います。

前述の通り、第1正規系にするには直積集合やべき集合を排除する、でしたね?

まずは直積集合の排除から行いましょう。

直積集合の排除

直積集合(direct product)とは、集合の集まりです。

関係(受講講座)で言えば、「学生名(学生コード)」に当たります。

これは1つのドメイン(マス目)の中に「山田(S001)」のように、属性(学生名)と属性(学生コード)の複数の属性の集合値が入っており、単一値ではないため、これを排除していきます。

関係表の赤文字の箇所が直積集合となってます。

・関係(受講講座)

受講コード 受講日 学生名(学生コード) 講座コード 講座名 受講料 受講数 支払合計
1001 2019-04-01 山田(S001) C001 数学 5,000 3 15,000
C002 国語 5,000 2 10,000
1002 2019-04-01 佐藤(S002) C001 数学 5,000 1 5,000
C003 英語 8,000 2 16,000
C005 社会 4,000 1 4,000
1003 2019-04-01 鈴木(S003) C004 理科 6,000 3 18,000
1004 2019-05-30 鈴木(S003) C005 社会 4,000 4 16,000


直積集合を排除すると…!?

・関係(受講講座)

受講コード 受講日 学生コード 学生名 講座コード 講座名 受講料 受講数 支払合計
1001 2019-04-01 S001 山田 C001 数学 5,000 3 15,000
C002 国語 5,000 2 10,000
1002 2019-04-01 S002 佐藤 C001 数学 5,000 1 5,000
C003 英語 8,000 2 16,000
C005 社会 4,000 1 4,000
1003 2019-04-01 S003 鈴木 C004 理科 6,000 3 18,000
1004 2019-05-30 S003 鈴木 C005 社会 4,000 4 16,000

べき集合の排除

次にべき集合を排除します。
べき集合(power set)とは難しく言えば、与えられた集合から、その部分集合を元として全て集めた集合です。

具体的には受講コード”1001“に対する講座コード{C001, C002}のように、
1つの{受講コード}に対して、{講座コード}と{講座名}はべき集合となっています。

関係表の赤文字の箇所がべき集合となってます。

・関係(受講講座)

受講コード 受講日 学生コード 学生名 講座コード 講座名 受講料 受講数 支払合計
1001 2019-04-01 S001 山田 C001 数学 5,000 3 15,000
C002 国語 5,000 2 10,000
1002 2019-04-01 S002 佐藤 C001 数学 5,000 1 5,000
C003 英語 8,000 2 16,000
C005 社会 4,000 1 4,000
1003 2019-04-01 S003 鈴木 C004 理科 6,000 3 18,000
1004 2019-05-30 S003 鈴木 C005 社会 4,000 4 16,000


べき集合を排除すると…!?

・関係(受講講座)

受講コード 受講日 学生コード 学生名 講座コード 講座名 受講料 受講数 支払合計
1001 2019-04-01 S001 山田 C001 数学 5,000 3 15,000
1001 2019-04-01 S001 山田 C002 国語 5,000 2 10,000
1002 2019-04-01 S002 佐藤 C001 数学 5,000 1 5,000
1002 2019-04-01 S002 佐藤 C003 英語 8,000 2 16,000
1002 2019-04-01 S002 佐藤 C005 社会 4,000 1 4,000
1003 2019-04-01 S003 鈴木 C004 理科 6,000 3 18,000
1004 2019-05-30 S003 鈴木 C005 社会 4,000 4 16,000

このように、第1正規形の関係はシンプルな表の形式となり、各属性の値は単一値となります。

候補キーを決定

さて第1正規形まで正規化ができましたが、この関係表の候補キーを考えていきましょう。

候補キーとは「関係表のタプルを一意に識別できる属性または属性の組のうち極小のもの」というものでした。
※詳しくはこちらの記事を参照ください。

また関係の前提条件は次の通りです。

  • 学生は複数講座受講できるので、受講データは複数ある
    →学生が前回受講した日とは異なる日に講座を受講する時、受講コードが新たに発行されタプルが新規に作成される。
  • 学生コードに対する学生名の重複はない
    →学生名が決まれば学生コードも一意に決まる。
  • 講座コードに対する講座名の重複はない
    →講座名が決まれば講座コードも一意に決まる。

関係(受講講座)では、{受講コード, 講座コード}が決まれば、タプルを一意に特定できそうですので、
{受講コード, 講座コード}は候補キーの一つになりそうです。

また条件にある「講座コードに対する講座名の重複はない」から、{講座名}も{講座コード}の代わりになりそうです。

従って関係(受講講座)における候補キーは
・{受講コード, 講座コード}
・{受講コード, 講座名}
の二つになります。

主キーを決定

候補キーが決まったところで、次は主キーを決定していきたいと思います。

主キーは「候補キーの中から選択し、またその属性は非NULL値(空ではない)である事」が条件でした。

ただ今回、関係(受講講座)においては{講座コード}も{講座名}もNULLである値はありません。

このような場合、どちらを選んでも問題ありませんが、一般的にはデータサイズが小さい方を選ぶことが多いので、
主キーは{受講コード, 講座コード}にしたいと思います。

では主キーが決定したことですし、関係表を改めて以下に表記します。

・関係(受講講座) ※主キー決定版

受講コード 受講日 学生コード 学生名 講座コード 講座名 受講料 受講数 支払合計
1001 2019-04-01 S001 山田 C001 数学 5,000 3 15,000
1001 2019-04-01 S001 山田 C002 国語 5,000 2 10,000
1002 2019-04-01 S002 佐藤 C001 数学 5,000 1 5,000
1002 2019-04-01 S002 佐藤 C003 英語 8,000 2 16,000
1002 2019-04-01 S002 佐藤 C005 社会 4,000 1 4,000
1003 2019-04-01 S003 鈴木 C004 理科 6,000 3 18,000
1004 2019-05-30 S003 鈴木 C005 社会 4,000 4 16,000

さいごに

今回は正規化の1つの種類である、第1正規形について学びました。
次は今回の表を用いて、第2正規形について説明していきますので、よろしくお願いします!

正規化入門#03(第2正規形)こんにちは、cocomaruです。 前回は非正規形の表を第1正規形へ変形するところまで行いました。 今回は次の正規形である、第2正規...