定食屋の取引管理
https://gyazo.com/811ef4f8956d60b8d6a717de45e144a5
項目一覧
店舗名
住所
電話番号
日付
責(レジ担当)
商品名
単価
合計
数量
伝票番号
表で書くと
https://gyazo.com/db52ad7edbdf79a8a2849b77df2eccc9
第一正規化
テーブル中に繰り返し項目が存在しない
上記、表での繰り返し項目
商品名
単価
数量
1レコード : 1情報
https://gyazo.com/1d8b9f84d1ce96a4ddf7582263731e9f
情報を1つに特定しやすいように「商品ID」を追加する。
https://gyazo.com/e8266143b5813be0b39fbb7b76c671de
また、導出項目はこの時点で削除しておく、
今回でいう「合計」
https://gyazo.com/8e9134329b3245a8ed7947b6bb1e1f65
第一正規化の時点で繰り返し項目を一気に別テーブルに出すときもある。
第二正規化
テーブルのすべての候補キーにおいて部分関数従属性が存在しないこと
候補キーとは
候補キーとはテーブル上で任意のレコードを特定するためのカラムの集合。つまり主キーやユニークキー。
NULLやユニークでないカラムは当てはまらない。
個人的な考え)あと、キーにするならあまり変わらないものの方がいい。
「伝票番号」(+) 「商品ID」
関数従属性とは
特定のカラムAが決まれば、別のカラムBも特定できる関係。
上の表で言えば、
「伝票番号」が決まれば「日付」が決まる。
「商品ID」が決まれば「単価」が決まる。
部分関数従属性とは
ある非キー属性が、候補キーのー部に関数従属している場合
https://gyazo.com/b643a020a5ddd1e49d40abebb985913d
非キー属性の「商品名」「単価」が「商品ID」に関数従属している。
非キー属性の「店舗名」「住所」「電話番号」「日付」「責(レジ担当)」が「伝票番号」に関数従属している。
部分関数従属性が存在しないこと、が第二正規化なので、この部分を別テーブルにする
https://gyazo.com/dbdba33e1f112606e088ecfb498baef7
上記は単純に候補キーが一つずつしかないので、これ以上部分関数従属性は存在しない。
第三正規化
テーブル内の非キー属性→非キー属性の関数従属、つまり推移関数従属性が存在しないこと
推移関数従属性とは
関数従属性が推移的に行われている、即ち(1)X→Y、(2)Y→Z、(かつY→Xでは無い)を全て満たす性質。
https://gyazo.com/98d2e7e185c4fd60eb8de3f13a7b363c
上記表でいう「伝票番号」→「店舗名」→ 「住所」「電話番号」
この関係が存在しなくなるようにテーブルを分ける。
https://gyazo.com/45a1039372607d3b41d13842a35d7677
データを扱いやすいよう「店舗ID」を追加する。
これで正規化は完了
テーブルに名前をつけるなら
①伝票詳細テーブル
②伝票テーブル
③商品テーブル
④店舗テーブル