データベース

データベースの正規化(正規形)をシンプルに学ぼう!

2018年12月4日

正規化って、難しいんですよね。。。

「正規化」って言葉を聞くだけで、正規分布=偏差値を思い出してしまい、ちょっと苦い感じがするのは私だけなのかもしれませんが(汗)

と、後ろ向きに始めてしまいましたが、データベースの基礎として「正規化」は非常に重要です。

今回は、この正規化に関して、具体例を上げて解説します!

 

正規化の目的

まず、正規化の大きな目的としては、

データに矛盾や重複を生じさせていない状態を作ること

です。

つまり、最適化です!

データベースの設計を最適化することで、使い易い、高性能なデータベースを作り上げることができます。

続いて、正規化のメリット、デメリットを見てみましょう。

 

正規化のメリット

正規化のメリット
  1. データ管理(保守)が容易になる
    データに変更が必要な場合、無駄を排除しているため最小限の修正(マスタのみの修正)で済みます。
  2. データの共通性(汎用性)向上
    正規化されたデータは、複数のシステムからも利用しやすくなります。またデータ移行もスムーズに行えます。
  3. データ容量の削減
    無駄な項目を削除するため保存に必要なデータ(ディスク)領域を削減できます。データ処理の効率も良くなります。

 

正規化のデメリット

正規化のデメリット

正規化ばかり意識し過ぎると「検索の内容」によっては、パフォーマンスが低下する場合もあります。
データ検索・データ更新の頻度やリレーションの階層などと、実際の業務バランスを見て正規化は行いましょう。
場合によっては意図的に正規化を行わない方が性能が良いケースもあります。

メリット、デメリットを比較しましたが、メリットの方が大きいので、基本正規化はしていく感じですね。

では、続いては正規化の中身を見てみましょう。

 

正規化の種類

正規化には第一正規化・第二正規化・第三正規化と段階を踏みながら進んでいき、細分化されていきます。

また通常は、第三正規化までを行えば十分ですが第四正規化・第五正規化まで存在します。ボイスコッド正規化というものあります。

ボイスコッド正規化は「第3正規形を強化したもの」ですが、詳しくはwikiをご参照ください。

 

非正規形

正規化の説明の前に、「正規化する」ということは正規化していないものがある、ということを理解しておきましょう。非正規形というものを理解することで、正規化する意味が分かると思います。

例を以下の絵にしてみました。

帳票の中に繰り返し部分があるので、各レコードの長さがバラバラで、素直な2次元の表になっていません。これが、非正規形の表となります。

データベース(DBMS)では、非正規形の表は管理することができないため、正規化をしていく必要がありますね。

非正規化の表の例

第1正規形

では、最初の第1正規化に関してです。正規化された表のことをを正規形と呼びます。

第1正規形の表は繰り返しを除いたカタチです。

データベースは縦方向にデータ(レコード)を追加していく操作には適しておりますが、横方向に増えるのはNGです。そこで、伝票などで横方向に伸びていた非正規形の繰り返し部分を切り離し、縦に並べるよう(重複を無くす)にカタチを変更していくと第1正規形となります。

大事なのは横方向の長さは固定する、ということです。

第1正規化の表の例

 

第2正規形

第2正規形の表は従属関係を排除(分離)したカタチです。

従属関係の排除とは何か?ちょっと難しい言葉ですが、主キーが決まると、列の値が一意に定まる関係のことを関数従属と呼びます。何故、関係ではなく「関数」という言葉なのかは深く考えず覚えることが良いです。

そしてもう一つ部分関数従属という言葉も出てきます。これはあるレコードが複合キーの一部の項目だけで、列の値が一意に定まる関係のことです。第1正規形において、主キー(複合キー)からレコードを特定できますが、主キーの一部分に対して上記の関数従属する項目なので、部分関数従属と呼んでいます。

第2正規形とは部分関数従属している列を切り出したものです。以下にイメージを載せます。

大事なことは、第1正規形において明細が繰り返されるたびに重複していたデータを分離する、ということです。

第2正規化の表の例

 

第3正規形

最後の第3正規形は推移的関数従属関係を排除(分離)したカタチです。

またまた、難しい言葉が出てきましたが、推移的関数従属とは主キー以外の列に関数従属している列のことです。これにより、分離した表に追加情報なども付けやすくなり、管理効率が上がります。以下にイメージを載せます。

第2正規形から「更に分離できる部分は分離する」、ということです。

第3正規化の表の例

 

まとめ

今回はデータベースの設計において非常に重要な「正規化」を学習しました。

順番に正規化を進めることにより、効率的に管理できる表ができあがります。

部分関数従属、推移的関数従属など難しい言葉もありますが、例をいくつも見て身に付けていく方法も良いですね。レコードの重複を無くして、綺麗にしていくと、第3正規形に自然となっていくと思います!!

データベースの設計に関しては、コチラの記事でもまとめてますので、ご参考にしてみてください。

 

以上です!

参考サイト)

-データベース