0
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?

More than 5 years have passed since last update.

RDBの第1正規形について考えてみる

0
Last updated at Posted at 2021-03-09

はじめに

どうも、初学者です!
最近SQLを掘ってるところなので情報はしょぼいかもしれません。
が、自分が理解できるようにかなり噛み砕いて、かつ初心者さん目線になってまとめていきます!

間違いございましたら教えていただければ幸いです。

前提に

テーブル設計で意識すること4箇条

  • 何を管理するか決める
  • どんなテーブルにするか決める
  • テーブルとテーブルの参照関係をはっきりさせる
  • リレーショナルデータベースのルールに乗っ取って設計をする

以上の4点は最低限必要なことです。これを意識すること、大事です!
上部3つの項目は、いつも紙に殴り書いてます。笑

という事で、今回は4つ目の「リレーショナルデータベースのルール」について今一度考えていきましょう!

RDBのあるべき形とは?

よく耳にしますが詳しくは知らないRDBの正しい形。
具体的には、RDBで管理したい項目を整理し、各項目の内容や、項目同士の関係性も正しく保てるように
テーブルを設計するために行います。

ちょっと復習! RDBとは?

リレーショナルデータベースの略。
二次元の表の形でデータを管理するデータベースのことを指します。
(その中にMySQLやOracleという複数の種類が存在している!)

正規化とは?

正規化とは、テーブルの設計内容(スキーマ)を、ルールに従った状態にすることです。
「RDBは表の形でデータを管理する」とはいうものの。。
表の形になっていてデータを溜めるだけだと、ただの入れ物になってしまいます。

それの何が問題って、まず非常に扱いにくいものになるということ。
この時点ではふわっとでもそう捉えていて問題ないです。

では、データベースを正規化するとどんなメリットがあるのかを考えてみると、

  • データの重複を取り除ける
  • 矛盾した状態を作り出さないように管理できる
  • 必要なタイミングでデータの更新が出来る

..といったことがあげられます。

一定のルールに従った形に形成することで、正しいデータベースが出来上がるんですね!
では、アンチパターンを避けるためにもルールの中身を見ていきましょう。

ルールに乗っ取って正規化を学ぶ

更新不整合

正規化の目的の一つに、更新不整合を防ぐことがあります。

更新不整合の内訳として、

  • 修正不整合(データを更新したときに起こる不整合)
  • 挿入不整合(データを追加するときにおこる不整合)
  • 削除不整合(データを削除するときの不整合)

の3つがあります。
漢字だらけですが、中身はシンプル!意味が理解できれば問題ないです。

どうやって防げばいいの?

〜キーワードは、「1つの事実は1回」〜

更新不整合を防ぐために**「正規化」**をする必要があります。
この正規化、第1正規形 → 第2正規形 → 第3正規形 とステップを踏んで進めていきます。
正規化の図.png
※正規化の種類でいうと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

0
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
0
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?