正規化とは?

関係データベースにおいて、テーブル更新等の運用をしていく中で適切なテーブル設計を行っていないと、意図しなくとも「残すべき情報が無くなる」や「同じであるべきデータが別々の情報を持つ」という恐れがあります。
正規化は「上記の恐れが起きないように(基本的に”元に戻せる”前提で)データを複数のテーブルに分割(したDB全体のテーブル構成)」を意味します。(分割する事で、1テーブルに存在する情報の重複や、複合的な関係性をシンプルにします。)
※複数のテーブルに分割することは、データ内の属性(列)の関係を分解することと言い換えられます。また、上記の”元に戻せる”というのは、分解した状態でも「分割前にあった属性の関係」は残っていることを意味します。そのような分解を「情報無損失分」と呼びます。

正規形は下記種類があり、下にいくに連れて、より整備していくイメージになります。
今回はそれぞれをざっくり説明します。
※尚、下記説明では「超キー」や「候補キー」、「関数従属」等の用語を既知として記載します。それら用語については別記事で説明したいと思います。

  • 第1正規形
  • 第2正規形
  • 第3正規形
  • ボイスコッド正規形
  • 第4正規形
  • 第5正規形

第1正規形

下記①を満たすテーブル構成を意味します。つまりは、「各値は単純な形である」という構成です。

①各レコードの各列に直積や集合が存在しない。
 →直積は複数の列にし、集合はその分レコードを作る。

第2正規形

下記①②を満たすテーブル構成を意味します。下記②は「各列は候補キーに部分関数従属しない」と言い換えられます。

①第1正規形である
②候補キーの真部分集合に関数従属する列はない

 →「テーブルA,B,C,Dの4列があって、A,Bが候補キー」という前提の時に、もし「CがBに関数従属」ならば第2正規形ではありません。その場合は、「対象テーブルからCを外し、新たに、B,Cのテーブルを作る」事で第2正規形を作っていきます。

第3正規形

下記①②を満たすテーブル構成を意味します。下記②は「各列は候補キーに推移的関数従属しない」と言い換えられます。

①第2正規形である
②候補キー以外の列に関数従属する列はない

 →「テーブルA,B,C,Dの4列があって、A,Bが候補キー」という前提の時に、もし「DがCに関数従属」ならば第3正規形ではありません。その場合は「対象テーブルからDを外し、新たに、C,Dのテーブルを作る」事で第3正規形を作っていきます。

ボイスコッド正規形

下記①を満たすテーブル構成を意味します。

①任意の関数従属「X->Y」(YはXに関数従属)において、Xは超キーである
 →「テーブルA,B,C,Dの4列があって、A,Bが候補キー」という前提の時に、もし「BはCに関数従属」ならばボイスコッド正規形ではありません。その場合は、「対象テーブルからBを外し、新たに、B,Cのテーブルを作る」事でボイスコッド正規形を作っていきます。

※第1正規形から第2正規形、第2正規形から第3正規形への分解は「情報無損失分解」ですが、ボイスコッド正規形への分解はそうならない可能性があります。

第4正規形

下記①を満たすテーブル構成を意味します。「YがXに多値従属」とは、「Xが決まれば”Yの値の集合”が決まる」という意味です。(つまり、関数従属の拡張のイメージです。)

①任意の多値従属「X->->Y」(YはXに多値従属)において、Xは超キーである
 →「テーブルA,B,Cの3列がある」という前提の時に、もし「B,CはそれぞれAに多値関数従属(であり、関数従属でない)」という場合、(Xは超キーにならないので)第4正規形ではありません。その場合は、「A,Bのテーブル、A,Cのテーブルを作る」事で第4正規形を作っていきます。

第5正規形

下記①を満たすテーブル構成を意味します。「結合従属性がある分解」とは、対象テーブルの列を「”結合したら元に戻せる“ような分解」を意味します。また、下記では「自明でない」と記載してますが、自明なものは何かというと「分解後のテーブル群の中に、分解前のテーブルを含める」事を指します。(分解前+αならば、当然分解前に戻せますねっていう話です。)

①自明でない「結合従属性がある分解」が存在する場合、分解後の各テーブルの列は分解前テーブルの超キーである
 →「テーブルA,B,Cの3列があり、主キーはA,B,Cの全列」という前提の時に、もし、「任意の2列に多値従属(且つ関数従属でない)の関係」の場合、第5正規形ではありません。なぜなら、「AとB、BとC、AとCの3テーブルに”結合従属性がある”分解(★)が可能」ですが、「その分解後の各テーブルの列(いずれも2列)は、分解前の超キー(A,B,Cの3列)でない」ためです。その場合は、上記(★)の分解をする事で第5正規形にできます。

By clear

データエンジニア・機械学習・分析等を主とし、Webアプリ開発も行っているフリーランスです。