はじめに
どうも、初学者です!
最近SQLを掘ってるところなので情報はしょぼいかもしれません。
が、自分が理解できるようにかなり噛み砕いて、かつ初心者さん目線になってまとめていきます!
間違いございましたら教えていただければ幸いです。
前提に
テーブル設計で意識すること4箇条
- 何を管理するか決める
- どんなテーブルにするか決める
- テーブルとテーブルの参照関係をはっきりさせる
- リレーショナルデータベースのルールに乗っ取って設計をする
以上の4点は最低限必要なことです。これを意識すること、大事です!
上部3つの項目は、いつも紙に殴り書いてます。笑
という事で、今回は4つ目の「リレーショナルデータベースのルール」について今一度考えていきましょう!
RDBのあるべき形とは?
よく耳にしますが詳しくは知らないRDBの正しい形。
具体的には、RDBで管理したい項目を整理し、各項目の内容や、項目同士の関係性も正しく保てるように
テーブルを設計するために行います。
ちょっと復習! RDBとは?
リレーショナルデータベースの略。
二次元の表の形でデータを管理するデータベースのことを指します。
(その中にMySQLやOracleという複数の種類が存在している!)
正規化とは?
正規化とは、テーブルの設計内容(スキーマ)を、ルールに従った状態にすることです。
「RDBは表の形でデータを管理する」とはいうものの。。
表の形になっていてデータを溜めるだけだと、ただの入れ物になってしまいます。
それの何が問題って、まず非常に扱いにくいものになるということ。
この時点ではふわっとでもそう捉えていて問題ないです。
では、データベースを正規化するとどんなメリットがあるのかを考えてみると、
- データの重複を取り除ける
- 矛盾した状態を作り出さないように管理できる
- 必要なタイミングでデータの更新が出来る
..といったことがあげられます。
一定のルールに従った形に形成することで、正しいデータベースが出来上がるんですね!
では、アンチパターンを避けるためにもルールの中身を見ていきましょう。
ルールに乗っ取って正規化を学ぶ
更新不整合
正規化の目的の一つに、更新不整合を防ぐことがあります。
更新不整合の内訳として、
- 修正不整合(データを更新したときに起こる不整合)
- 挿入不整合(データを追加するときにおこる不整合)
- 削除不整合(データを削除するときの不整合)
の3つがあります。
漢字だらけですが、中身はシンプル!意味が理解できれば問題ないです。
どうやって防げばいいの?
〜キーワードは、「1つの事実は1回」〜
更新不整合を防ぐために**「正規化」**をする必要があります。
この正規化、第1正規形 → 第2正規形 → 第3正規形 とステップを踏んで進めていきます。

※正規化の種類でいうと8つになるそうですが、一般的には第3正規までが主流とのことです。
そのためこの記事では第3正規形までを目指します!
第1正規形
データをテーブルに格納できる形が第1正規形です。
非正規形(第1正規形になっていないものを指す)のデータを正規化します。具体的には、
各列に同じデータの値が1つだけ入るようにすることです。
↓非正規形
| 出席番号 | 名前 | 得意科目 |
|---|---|---|
| 001 | 新井 太郎 | 数学、家庭科 |
| 002 | 飯田 次郎 | 現代文 |
| 003 | 上田 三郎 | 地理、歴史 |
↓
↓第1正規形に変更!(各列のデータ型を単純に!)
↓
| 出席番号 | 名前 |
|---|---|
| 001 | 新井 太郎 |
| 002 | 飯田 次郎 |
| 003 | 上田 三郎 |
| 出席番号 | 得意科目 |
|---|---|
| 001 | 数学 |
| 001 | 家庭科 |
| 002 | 現代文 |
| 003 | 地理 |
| 003 | 歴史 |
..となります。
テーブルを値の組み合わせの集合と捉えることがキーになります。
そして、各列にはデータ型の値は1つ。コンマで区切るのはナンセンスです!
導入項目の排除
第1正規化では、導出項目の排除も行います。
導出項目とは、何かによって導き出される値のことです。
例えば商品購入用のテーブルがあるとします。
| 単価 | 個数 | 金額 |
|---|---|---|
| 100 | 2 | 200 |
| 550 | 1 | 550 |
単価と個数までは問題ないのですが、合計金額はダメです。
理由は、単価だけ修正した場合、金額と矛盾してしまうためです。
| 単価 | 個数 | 金額 |
|---|---|---|
| 200 | 2 | 200 |
| 500 | 1 | 550 |
| ↑単価が変動して修正しても、金額は変わらず矛盾してしまっている。 |
このように、導出項目の排除とは、
**「修正する人が間違えないように気をつける」のではなく、「データの構造として、単価と構造だけを保存する」**ということになります。
この考え方は慣れていかないと難しいと個人的に感じます。。
繰り返し項目の排除
繰り返し項目があると、第1正規形になりません。
といきなり言われてもわからないので具体例を見ていきましょう。笑
名簿に電話番号を記述する欄が3つある状態をイメージします。
| 氏名 | 電話番号1 | 電話番号2 | 電話番号3 |
|---|---|---|---|
| 谷中 花子 | 090-xxxx-xxxx | 0246-xx-xxxx | 080-xxxx-xxxx |
上記の項目を繰り返し項目といいます。
リレーショナルデータベースでは、この繰り返し項目はNG。
確かに「二次元の表」にはなっていますが、問題がモリモリ。
1.例えば、電話番号を4つ持っている人がいたら?
= これでは管理できません。
2.電話番号を一つしか持っていない人は?
= 2番と3番が空欄、つまりNULLとなってしまいます。。
3.電話番号1番を削除したら?
= 2番と3番は詰めるべき、、?
上記のような問題があげられます。
解決策
電話番号で何か処理をするなら、電話番号を管理するテーブルを別に作るのが良いかと思われます。
まとめ
列×行以外の構造を取り除くことが、第1正規形の役目でした!
レシピサイトを作るときに、材料の記述をするテーブル設計に悩んだのが思い出されました。笑
結果的にはJSの力を借りましたが、それはまた別記事で。
第1正規形だけでなかなか長くなったので今日はここまで。m(_ _)m