1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【応用情報技術者】データベース正規化

Posted at

はじめに

現在、応用情報技術者試験に向けて勉強をしているひよっこエンジニアです。
データベースの正規化について、復習の意味で記事にまとめたいと思います。
勉強中の初学者ですので、誤りなどがありましたら訂正していただけますと幸いです。

参考書籍

資格の勉強にはこちらの書籍を使用しています。

正規化とは

データベースのデータの更新(挿入、削除、修正など)を行なったとしても、データの整合性を保てるようにすることを目的とした操作です。

正規化した表のことを正規形といい、これには第1正規形から第5正規形までがあります。一般的なデータベースであれば第3正規形までで十分だと言われているみたいなので、今回は第3正規形までをまとめます。

第1正規化

非正規形から第1正規形にする、

繰り返し部分を排除する操作

です。言葉だけだとよくわからないので、実際のデータベースの例を示します。

今回例として考えたデータベースは、複数の店舗を持つチェーン飲食店の中央注文管理システムです。実際の店舗でこのようなデータベースが存在するのかはわかりませんが…

まずは、正規化されていない非正規形の表です。
image.png

これに第1正規化の操作を行なって、以下のような第1正規形にします。
image.png

非正規形だとセルを結合している部分がある、つまり、平坦な2次元になっていません。これでは関係データベースで定義できません。そこで、「商品番号」より右の繰り返し部分を別の表に分解しました。これによって平坦な2次元になりました。
売上明細表の主キーは「注文番号」と「商品番号」の複合キーで、「注文番号」は売上表の「注文番号」を指す外部キーです。

第2正規化

第1正規形から第2正規形にする、

すべての非キー属性が、主キーに完全関数従属である状態にする操作

です。

この操作を行なった第2正規形です。段々と画像の文字サイズが小さくなってきました…
image.png
第1正規形だと、売上明細表の「商品名」と「単価」が、主キーに完全関数従属ではなく、主キーの一部である「商品番号」に部分関数従属している状態でした。

関数従属

Xの値が決まるとYの値も決まるとき、YはXに関数従属するといいます。
X->Y と表現します。

部分関数従属

Xの属性が複数ある(X1, X2とする)とき、X->Yであり、X1->Y または X2->Y である場合に、YはXに部分関数従属するといいます。

完全関数従属

Xの属性が複数ある(X1, X2とする)とき、X->Yであり、X1->Y でも X2->Y でもない場合に、YはXに完全関数従属するといいます。

第3正規化

第2正規形から第3正規形にする、

非キー属性間の関数従属をなくし、どの非キー属性も主キーに直接に関数従属している状態にする操作

です。

この操作を行なった第3正規形です。
image.png
売上表に注目します。第2正規形では「店舗名」は「店舗番号」に関数従属で、非キー属性間の関数従属が存在したため、店舗表に切り分けます。

推移的関数従属

X->Y、Y->Z であり、Y->X でないとき、ZはXに推移的関数従属しているといいます。
第2正規形では X=注文番号、Y=店舗番号、Z=店舗名 としたときに成り立つので、「店舗名」は「注文番号」に推移的関数従属していると言えます。

おわりに

以上でデータベース正規化手順の説明を終わります。
分かりづらい箇所がありましたら修正いたします。
最後までご覧いただきありがとうございました。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?