3NFとBCNFの主な違いは、3NFを満たすにはテーブルが第2正規形であること、推移的依存関係がないこと、BCNFを満たすにはテーブルの素属性が非素属性に依存してはならないこと、です。
データの冗長性とは、同じデータが複数の場所で繰り返されることを指す。
また、データの挿入、更新、削除の際に問題を起こすこともあります。
正規化とは、データの冗長性を最小化するために、データを複数の関連するテーブルに整理することである。
テーブル内のデータを複数のテーブルに分割するため、データの冗長性に対する解決策を提供します。
ただし、データの冗長性を完全になくすことはできず、あくまでデータの冗長性を減らすことが可能である。
正規化には、1NF、2NF、3NF、BCNFなど様々な種類があります。
3NF、BCNFを論じる前に、1NF、2NFを理解することが必要である。
1NFとは
1NFを満たす表を作るには4つのルールがあります。
それらは次の通りです。
- テーブルの各カラムは自動的な値を持つべきです。
- カラムは同じ型のデータを持つべきです。
- 各列は一意な名前を持つべきです。
- データを格納する順序は重要でない。
テーブルが第1正規形でない場合、それは悪いデータベース設計とみなされる。
例として次のようなものがあります。
上のテーブルでは、subject列に複数の値が格納されている。
1NFを実行すると、表は以下のようになる。
2NFとは
2NFを満たす表を作るには2つのルールがあります。
それらは次の通りです。
- 表は1NF形式でなければならない。
- 部分的な依存関係がないこと。
学生の情報を格納するテーブルでは、学生IDが主キーであり、テーブル内の各行を個別に識別するのに役立つ。
他の列は主キーに依存する。
この依存関係を関数従属と呼びます。
例えば、score というテーブルがあるとします。
主キーは、学生 ID と科目 ID の組み合わせです。
このテーブルに講師名があれば、科目IDにのみ依存します。
このような依存関係を部分依存という。
例として、次のようなものがあります。
上記テーブルの主キーは、student_id と subject_id の組合せです。
講師名(lecturer_name)は別のテーブルに置くことができる。
これで、score、subject、lecturer テーブルは以下のようになります。
3NFとは
2NFを満たす表を作るには2つのルールがあります。
それらは次のとおりです。
- 表は第2正規形を満たしていなければならない。
- 他動詞を持たないこと。
例えば、scoreテーブルがstudent_id, subject_id, marks, exam_name, total_marksを持っているとする。
student_id と subject_id の組み合わせが主キーとなる。
この total_marks は、この主キーには依存しません。
exam_nameに依存する。
つまり、ある属性が主キー以外の属性に依存しているのです。
このような依存関係を推移的依存性と呼びます。
したがって、試験名と合計点数を別のテーブルで採点することができる。
BCNFとは
BCNFはBoyce-Codd-Normal Formの略です。
主属性が非主属性に依存しないようにする。
例として次のようなものがあります。
上記のテーブルの主キーは、student_id と subject の組み合わせです。
一人の講師が一つの科目を担当するので、そのカラムで各レコードを一意に識別することも可能です。
しかし、lecturer は主キーではありません。
subject カラムは主属性でない lecturer に依存します。
従って、このテーブルはBCNFを満たさない。
そこで、studentテーブルとlecturerテーブルを以下のように作成する。
3NFとBCNFの違い
定義
3NFとは、データベース設計の正規化において、実体が第2正規形であること、テーブルのすべての属性がその関係の候補キーによってのみ決定され、主属性以外には依存しないことを保証することにより、データの重複を減らし、参照整合性を確保するために用いられる正規形です。
一方、BCNFは、3NFを少し強くしたデータベース正規化で使われる正規形です。
したがって、ここが3NFとBCNFの大きな違いです。
機能性
表が第2正規形であり、推移的依存関係がないことが3NFを満たすのに対し、表の素性は表の非素性に依存しないことがBCNFを満たす。
従って、機能性も3NFとBCNFの違いの一つです。
結論
簡単に説明すると、正規化されたデータベースは良いデータベースと見な される。
正規化には様々な種類があり、3NFとBCNFの2つがあります。
3NFとBCNFの主な違いは、3NFを満たすためにはテーブルが第2正規形でなければならず、推移的依存関係があってはならないこと、BCNFを満たすためにはテーブルの主属性がテーブルの非主属性に依存してはならないことです。