データベースを勉強したいと言う方が増えています。
データサイエンティストやビックデータを取扱うエンジニアになるために、データベースの知識が必要と思う方がその一例です。
データベースの勉強で一番最初につまずくのが、「どうやってデータベースを設計すればいいか」かと思います。
その際に出てくるデータベース設計の一つの手法が、「正規化」です。
この「正規化」は、IPA(独立行政法人 情報処理推進機構)が主催する情報系の資格の「基本情報技術者試験」や「応用技術者試験」の出題項目にもなっており、必須知識になります。
この記事では、データベースの「正規化」についてわかりやすく解説していきたいと思います。
もくじ
データベースのメリット
ここで言うデータベースとは、リレーショナルデータベースを指します。
普段、複雑でないデータは、一つのファイル内でデータを管理しているかと思います。
しかし、データ数が増えてくると「効率的にデータを抽出したい」、「ある一部のデータ名を変更したい」という要望が出てきて、変更が大変になったり、中途半端なデータ更新になってしまいデータの信憑性が損なわれる恐れがあります。
そんな時に便利なのがデータベースになります。
重複なデータを無くし検索しやすくする
データベースは、できるだけシンプルなデータのまとまり(テーブル)を作りデータを管理します。
一度シンプルなテーブルを作ってしまえば、複数のテーブルをつなぎ合わせるだけでユーザが求めるデータフォーマットで出力することができます。
例えば、コンビニのレシートを見ていただければわかると思いますが、情報がいっぱい記載されています。
「日付」、「店舗名」、「購入商品名」、「商品個数」、「合計」がそれにあたります。
それらの情報は、我々が求めるデータフォーマットで出力されていますが、店舗情報を管理するテーブルや商品情報を管理するテーブルから生成されています。
シンプルなデータ構造になっているからこそ、重複なデータがなくなり、変更が生じた場合でも限定された変更で済むわけです。
データベースの需要はこれから更に
先ほどはコンビニのレシートの例を挙げましたが、他にもデータの種類は増え続けています。
携帯電話やスマートウォッチに搭載されたセンサや自動車に搭載されたセンサが取得したデータをビックデータの一部としてデータセンターに格納し、健康診断や自動運転に使われ初めています。
少し身近な話をすると、皆さんもご存知のクラウドソーシングのランサーズでは、「AI・ビックデータ処理」の検索カテゴリーを作成しています。
それらの業務案件が上昇傾向にあることからも、これから更に需要が増えるとも言っていいでしょう。
ランサーズ:個人間や個人法人間で請負業務のマッチングサービスを提供する企業
データベース設計の基礎(正規化)
それでは、データベース設計の中で重要な知識の「正規化」を見ていきましょう。
まずは、下記の図を見てください。これは、正規化される前のデータ例です。
このデータ量は少ないですが、膨大なデータ量になっても大丈夫なデータベース設計できますか?
非正規形
この状態は、非正規形状態です。非正規形とは、テーブルのどこかに空欄があったりする場合になります。
複数の既存テーブルを一つに統合した際に、データがないエリアが空欄になります。
つまり、統合したこの状況では、テーブルと言えないと言うことです。
第1正規形
非正規形から第1正規形にするのは簡単で、先ほどの空欄を埋める作業になります。
この状態でようやくデータ出力することができるテーブルとなります。
次に、このテーブルから、繰り返し部分を無くしましょう。
レシートの「購入日付」と「商品No」(候補キー)の間でテーブルを分割しますが、分割された後にテーブル間の関連がなくなってしまうため、テーブル内のメイン項目(データベース用語では、主キーになります。)を商品No項目が含まれるテーブルにも付与します。
そうすれば、二つのデータを結合する条件に、「購入No」(メイン項目)を使えば、データ出力できます。
第2正規形
第1正規形から第2正規形にするのは、少し難しいです。
第2正規形の「購入明細書」を見ると、まだ独立できそうな項目が残っています。
「商品No」が決まれば、「商品名」が決まります。なので、「購入明細書」の中にある必要はありません。
例えば、「商品名」を変えないといけない状況に落ちいた場合、第1正規形のままだと、複数行を変更する必要が出ます。
商品一覧として、別テーブルにしておけば、商品一覧の「商品名」のみ変更すれば、購入明細書は”いっさい”変更がいりません。
これで第2正規形になりました。
第3正規形
最後に、第2正規形から第3正規形にする方法です。
第2正規化と方法が似ています。
「購入No」(主キー)以外で、独立できそうな項目がないかを確認します。
「商品No」 と「商品名」と同じで、「会員番号」と「会員名」も別のテーブルにすることができます。
下記のようになれば、第3正規化が完了です。
これにより、レシートに会員名を記載しないこともできるようになりました。(セキュリティ対応にもなります。)
正規化済みのテーブル
下記が、正規化した結果になります。
テーブルをシンプルにしたため、ユーザが求める形でデータ出力出来ますし、データ量が多くなっても無駄なデータ容量も不要で、検索もしやすいです。
データベース設計の勉強の仕方
データベース講座1:データベース論理設計
テーブル設計を設計者間で共有するためのER図の書き方も学べますので、より実践的な内容になります。
公式サイトで確認する
ミック(著)達人に学ぶSQL徹底指南書 第2版 初級者で終わりたくないあなたへ
この書籍は、入門としては少し難しいですが、実務で通用するSQLの書き方を教えてくれますので、じっくり読んで初心者から脱却しましょう。
辞書として手元に置いておくことをおすすめします。