DBを勉強するときに最初に出てくるのが「正規化」です。
この辺りを勉強しているときに出てきたいくつかの用語を一覧でまとめてみました。
正規化
データベースのテーブルを、効率的で一貫性のある形に整理するプロセスです。
たとえば、同じ情報が複数の場所に重複しないように分割して整理することで、データの無駄や矛盾を防ぎます。
イメージとしては、混ざり合ったデータをきれいに分類して、すっきりと整理整頓する感じです。
更新時異常
データベースが適切に正規化されていないときに、データの更新、削除、挿入時に発生する問題です。
一つの情報を複数の場所に保存していて、どれか一つだけ更新し忘れると、他の場所と矛盾が生じるような状況です。
更新時異常が発生させないようにするためにテーブルとカラムの関係を「正規化」させる必要があります。
主キー
テーブル内で各行(レコード)を一意に識別するためのキーです。
たとえば、社員番号などがこれに該当します。主キーは、そのテーブル内で重複しないユニークな値を持つ必要があります。
候補キー
主キーとして使用できる候補のキーのことです。
テーブル内で一意の識別が可能な複数のフィールドがある場合、その中から主キーとして選ぶことができます。
学生証番号やパスポート番号のどちらも一意に個人を識別できるため、どちらを使うか選べる状態です。
非キー属性
テーブル内で主キー以外の属性(列)のことです。これらは、主キーによって一意に決まるデータです。
例えば、社員テーブルで「社員名」や「住所」がこれに当たります。名前や住所が社員番号(主キー)によって特定できる情報であることです。
関数従属
ある属性(列)の値が、別の属性(列)の値によって一意に決定される関係のことです。
たとえば、「社員番号」がわかれば「社員名」が一意に決まる場合、社員名は社員番号に関数従属しています。イメージとしては、郵便番号がわかればその地域名が決まる感じです。
完全関数従属
ある属性が複数のキー全体に従属している状態です。部分的ではなく、すべてのキーによってその属性が決まる必要があります。
例えば、「社員番号とプロジェクト番号の両方がわかれば、プロジェクト割り当て日が決まる」といった場合、プロジェクト割り当て日は完全関数従属しています。
部分関数従属
属性が、キーの一部だけによって決定される関係です。
たとえば、「社員番号とプロジェクト番号」がキーで、「社員番号」だけで「社員名」が決まる場合、社員名は部分関数従属しています。イメージとしては、郵便番号の前半部分だけで都道府県が決まる感じです。
推移関数従属
ある属性が、主キーに直接従属するのではなく、中間の属性を経由して間接的に従属する関係です。
例えば、「社員番号 → 部署番号 → 部署名」といった従属関係がある場合、社員番号から部署名が決まるのは推移関数従属です。
非正規化
非正規化とは、データベースのパフォーマンスを向上させるために、意図的にデータの重複を許可する設計手法です。
通常、検索速度を高める目的で使用されますが、データの一貫性を保つための管理が複雑になることがあります。
例えば、商品情報を持つテーブルで、同じ商品の詳細を複数の場所に持つようにすることが非正規化です。
第一正規形
第一正規形は、データベースの各列に一つの値だけが入るようにデータを整理する基準です。また、テーブル内のすべてのレコードが一意に識別できる必要があります。
例えば、顧客テーブルの「電話番号」列に複数の番号が入らないように、各行に一つの番号だけを入れることが第一正規形です。
第二正規形
第二正規形は、第一正規形を満たしつつ、主キーの一部にのみ依存するデータを別のテーブルに分けることです。これにより、データの冗長性を減らし、一貫性を保ちます。
例えば、学生テーブルで「学生ID」と「科目ID」が主キーで、学生の「住所」が学生IDだけに依存する場合、その住所情報を別のテーブルに分けることが第二正規形です。
第三正規形
第三正規形は、第二正規形を満たし、かつ、主キーに直接関係しない属性同士の依存関係を排除することです。これにより、データの整合性が向上します。
例えば、「社員ID → 部署ID → 部署名」のような依存関係がある場合、部署情報を別のテーブルに移動させ、社員IDから直接部署名が参照されないようにすることが第三正規形です。
ボイスコッド正規形
ボイスコッド正規形は、第三正規形をさらに厳密にした基準で、すべての属性が候補キーに完全に依存するようにテーブルを整理することです。これにより、データの一貫性と整合性が最大限に保たれます。
例えば、大学のコース管理システムで、講師が担当する複数のクラスにおいて、クラスIDと講師IDが両方主キーとして存在するとします。この場合、ボイスコッド正規形では、講師IDが候補キーとして一意に定義され、どのクラスにも講師が一意に関連付けられるよう整理されます。
無損失分解
損失分解とは、テーブルを複数のサブテーブルに分解しても、元のテーブルに存在していた情報が全て保持される分解方法です。つまり、サブテーブルを結合することで、元のテーブルと同じデータが再現できることを意味します。
パズルのピースを分けて、それぞれのピースを独立して管理できるが、全てのピースを組み合わせることで元の画像(テーブル)が完全に再現できる状態です。
候補キーから主キーを選ぶ際の注意点
主キーは候補キーの中から1つ選択できることがわかりました。
1つの属性だけで主キーとならないときは複数の属性を組み合わせて候補キーを検討する必要があります。
この時、主キーを構成する属性がNULL(値なし)である場合は選択できません。
どちらの場合でも構成する属性がNULLである場合、そのテーブルにおける1行が定かではなくなるからです。