【応用情報技術者試験】データベース

データベースのキーについて
関係データベースには、様々な種類の「キー」があります。
主なキーについて以下の表に示します。

主キー(Primary Key)
   一つのテーブルには一つの主キーがあり、そのキーによってテーブル内の各行(レコード)が一意に識別されます。
   主キーはNULL値を持つことができず、必ず一意でなければなりません。

候補キー(Candidate Key)
  主キーと同じく、テーブル内の各行を一意に識別できる属性(または属性のセット)です。
  ただし、一つのテーブルには複数の候補キーが存在する可能性があります。主キーは候補キーの中から一つ選ばれます。

非キー(Non-Key)
  候補キーでも主キーでもない属性を指します。
  非キーはテーブル内のレコードを一意に識別する能力がありません。

外部キー(foreign key)
  複数のテーブルの関係を結び付けるためのキーのことです。

完全関数従属、部分関数従属、推関数従属について
データベースの設計において、完全関数従属、部分関数従属、推関数従属は正規化の過程で重要な概念です。

完全関数従属
属性 ( A ) が属性セット ( B ) に完全関数従属する場合、( B ) の任意の部分集合に ( A ) が関数従属しないという条件が必要です。

例:
学生ID, コースID → 成績
学生ID, コースID→成績 では、成績は学生ID, コースIDに完全関数従属しています。

部分関数従属
属性 ( A ) が属性セット ( B ) に部分関数従属する場合、( B ) のいくつかの部分集合に ( A ) が関数従属するという条件があります。

例:
学生ID, コースID → 学生名
学生ID, コースID→学生名 では、学生名は学生ID, コースIDに部分関数従属しています。これは、学生名が学生IDだけにも関数従属しているからです。

推関数従属
属性 ( A ) が属性 ( B ) に関数従属し、属性 ( B ) が属性 ( C ) に関数従属するが、( A ) が ( C ) に直接関数従属していない場合、( A ) と ( C ) の間に推関数従属が存在します。

例:
部署ID → マネージャID
部署ID→マネージャID とマネージャID → マネージャ名
マネージャID→マネージャ名 の場合、部署IDとマネージャ名の間には推関数従属が存在します。

正規化とは
データの重複をなくし整合的にデータを取り扱えるようにデータベースを設計することを、データベースの正規化と呼びます。正規化を行っておくと、データの追加・更新・削除などに伴うデータの不整合が起きるのを防ぎ、メンテナンスの効率を高めることができます。
ここでは、データベースを設計する際に一般的に用いられる第1~第3正規形までを説明していきます。

非正規形

非正規形では、データが重複していたり、複数の値が1つのセルに格納されていたりします。

顧客ID名前住所 電話番号
1UT 太郎東京都港区090-○○○○-○○○○, 080-××××-××××
2アンカバ 花子大阪府大阪市北区070-△△△△-△△△△
3UT 太郎東京都港区090-○○○○-○○○○

非正規形のデータでは以下のような問題点が考えられます。

  • 1つのセルに複数の値が格納されている
  • データの重複が存在する
  • 更新や削除時に不整合が生じる可能性が高い

第1正規形

第1正規形では、すべての属性が「単一の値」を持つようにします。つまり、セル内に複数の値を持たない形です。

また、第1正規形とした時点で、主キーを定義します。この手順では顧客IDと電話番号からなる、複合主キーとする場合で説明を進めます。

顧客ID名前住所電話番号
1UT 太郎東京都港区090-○○○○-○○○○
1UT 太郎東京都港区080-××××-××××
2アンカバ 花子大阪府大阪市北区070-△△△△-△△△△
3UT 太郎東京都港区090-○○○○-○○○○

単一の値を持つ形とした第1正規形ですが、まだ以下の問題点が残っています。

  • 顧客ID「1」と「3」のデータが重複している
  • 顧客の情報が更新されるたびに、複数行を修正する必要がある

第2正規形

第2正規形では、部分関数従属性を排除します。先ほど確認したとおり、名前と住所は顧客IDのみで一意に決まるため、電話番号の分割を行います。

顧客テーブル(顧客IDを主キーとする)

顧客ID 名前住所
1UT 太郎東京都港区
2アンカバ 花子大阪府大阪市北区
3UT 太郎東京都港区

電話番号テーブル(顧客IDと電話番号を主キーとする)

顧客ID電話番号
1090-○○○○-○○○○
1080-××××-××××
2070-△△△△-△△△△
3090-○○○○-○○○○

分割を行うことで、顧客テーブルでは「顧客ID→名前、住所」の関係のみが残り、部分関数従属性が無くなりました。

第3正規形

第3正規形では、推移関数従属性を排除します。

第2正規形の顧客テーブルでは、顧客IDで住所が一意に決定し、それに伴って都道府県や市区町村が一意に決まります。このような推移関数従属性を排除するため、住所の分割を行いましょう。

顧客テーブル

顧客ID名前住所ID
1UT 太郎1
2アンカバ 花子2
3UT 太郎1

住所テーブル

住所ID住所
1東京都港区
2大阪府大阪市北区

電話番号テーブル

顧客ID電話番号
1090-○○○○-○○○○
1080-××××-××××
2070-△△△△-△△△△
3090-○○○○-○○○○

分割後は、顧客テーブル・住所テーブルともに、直接的な従属性のみであるため、第3正規形の条件を満たす形になりました。なお、住所が都道府県や市区町村に依存している場合は、住所をさらに分割します。

まとめ

正規化の作業を通じて、データの冗長性が軽減され、整合的に管理できるようになっていく過程がつかめたでしょうか。次回は実際にSQLを用いてデータの挿入・更新・削除といったことを行いますので、正規化のメリットをより強く実感できるものと思います。
それぞれの正規形の条件をあらためて以下にまとめます。

第1正規形
・繰り返し項目を持たない
・導出項目を持たない

第2正規形
・第1正規形を満たしている
・主キーに対してすべての非キー属性が完全関数従属

第3正規形
・第2正規形を満たしている
・すべての非キー属性がどの候補キーに対しても推移的に関数従属していない

コメント

タイトルとURLをコピーしました