ブレーンアシストオンライン

データベースの正規化について

データベースの正規化について

はじめまして。今年入社してはじめてIT業界に触れたまだかけだしの社会人です。

私の部署はアプリの開発や保守を主に取り扱っています。

IT未経験の私からしたら知らないことばかりでITになれるために試行錯誤の毎日です。

ですが、できることが少しずつ増えていくことは素直に嬉しいです。

データベースを扱うことが多くわからないことだらけで、調べていくと「データベースの正規化」を見つけました。

「データベースの正規化」とはなんぞやと個人的に思いました。

なので今回は「データベースの正規化」ついて、よく使われる第1正規化から第3正規化までをまとめていきたいと思います。

よろしくお願いいたします。

 

正規化とは

データベースを扱っていくうえで、矛盾と重複がないようにすることは重要です。

クレジットカード決済で考えると、データが重複すると二重に支払ってしまう可能性があります。

データに矛盾があると、顧客名簿とクレジットカード情報が結びつかず購入できない可能性があります。

そのような重複や矛盾をなくデータを扱えるようにデータベースを設計することを「データベースの正規化」と呼びます。

 

第1正規形

 

非正規形のものを第1正規形にします。
非正規形とは正規化がまったく行われておらず、1行の中に複数の項目が存在するようなテーブルを非正規形と呼びます。

スプラトゥーンの武器一覧で考えていきたいと思います。

注意:実際に存在しない武器があります。

また、武器は「武器の種類」、「サブウェポン」、「スペシャル」で一意に決まると仮定します。

 

この表をみるとひとつの「武器の種類」に対して複数のデータが入っているので非正規形となります。

リレーショナルデータベースではレコード単位で個々のデータを扱うので複数のデータが入っているものは1つずつ別レコードに独立させます。

「サブの種類ボムかボムじゃないかのカラム」は「サブウェポン」から判断できるので省略します。

この結果、表はこのようになります。

 


レコード単位で独立させて、導出できるものを省いたものが第1正規形となります。

 

第2正規形

第1正規形の観点からデータベースにデータを入られるようになりました。

しかしながら、このままでは不十分です。

なぜなら、新しい武器やスペシャルを追加したいとなった時に全てのカラムデータが揃うまで登録することができません。

また、武器の種類は1つに対して複数のレコードが存在するため、武器の種類の変更(そんなことはありえませんが)となったときに複数のレコードを修正する必要があります。
これは武器一覧、武器の種類、スペシャルといった独立したデータをひとつにまとめているので起こります。

これを解消するために別々のテーブルに分けます。

今回は「武器の種類」、「サブウェポン」、「スペシャル」で一意に決まると仮定しています。

データを一意に決める要素を主キーと呼びます

この主キー以外のカラムについて主キーの一部の要素で決まる要素を別のテーブルに分離します。
この項目に該当するカラムは主キー「スペシャル」で決まる「スペシャル性能」、「武器の種類」で決まる「塗り方」です。

この結果、表はこのようになります。

 

データの重複が取り除かれました。

 

第3正規形

第2正規形まで行いましたが、まだ十分とはいえません。

主キー以外同士で依存関係を持っているものがあります。

「武器の重さ」と「イカ速」です。

よって、「イカ速」に変更があったら複数のカラムに対して編集が必要になります。

この主キー以外同士で依存関係を持っているものも別テーブルに分離しましょう。

この結果、表はこのようになります。

 

これで第3正規形まで終了です。

 

さいごに

データの正規形についてまとめていきました。

非正規形から第3正規形を比べると格段に見やすく、扱いやすく変形できることがわかりました。

私の業務では不具合が起こるとデータベースから情報を取り出して調査することがあります。

どこで不具合が起きているのか調査しやすい環境は今回やった正規化によって担保されていることを実感することができました。

今後データを作成する機会があったら、正規化を行い、重複、矛盾が生じないよう気を付けて正しく正規化を行っていきたいと思います。

最後まで読んでいただき誠にありがとうございました。

 

引用元
OSS-DB “第4回データベースの正規化” https://oss-db.jp/dojo/dojo_info_04 (9/12参照)

Wiz テックブログ “データベースの正規化(第1~第3正規形)” https://tech.012grp.co.jp/entry/db_normalization (9/12参照)