Upgrade to Pro — share decks privately, control downloads, hide ads and more …

正規化の考え方を、架空のレストランチェーンで整理しよう。

 正規化の考え方を、架空のレストランチェーンで整理しよう。

第1~第4正規化、ボイスコッド正規化の方法を整理したよ!

harecome

March 31, 2024
Tweet

Other Decks in Technology

Transcript

  1. 0 | ワードの整理 (1/2) • 正規化の目的 CRUD 操作時に不整合が起こらないようにすること • 無損失分解

    正規化/テーブル分割後にもとに戻せること • 候補キー ここでは、あるレコードにおいて、行を特定できるカラム、 または複数カラムの組み合わせのこと 商品ID 商品名 AA01 辛味チキン AA02 アロスティチーニ(2本) AA04 ポップコーンシュリンプ 店舗ID 商品ID 価格 S0001 AA01 300 S0002 AA01 400 S0002 AA02 400
  2. 0 | ワードの整理 (2/2) • 関数従属 あるレコードにおいて、特定のカラムAの値が決まれば、 別のカラムBも特定できる(=一意に定まる)ような関係のこと ←商品IDは商品に関数従属している 商品ID

    商品名 AA01 辛味チキン AA02 アロスティチーニ(2本) AA04 ポップコーンシュリンプ AA25 柔らか青豆の温サラダ MT07 ディアボラ風ハンバーグ PA13 ラムのラグーソース(ペンネ) RP05 セットプチフォッカ DB01 セットドリンクバー
  3. 1 | 第1正規化 • 導出項目の排除 同じ表の他カラムから導出できるカラムは排除する 席番号 注文1 注文2 注文3

    27 AA25 MT07 DB01 32 PA13 RP05 単価 個数 価格 300 3 900 400 5 2000 • 繰り返し項目の排除 同じ種類のデータカラムが複数並んでいる場合、1列にまとめる 単価 個数 300 3 400 5 席番号 注文 27 AA25 27 MT07 27 DB01
  4. 2 | 第2正規化 • すべての候補キーにおいて部分関数従属を排除 候補キーの一部→非キー属性の関数従属を排除する (=候補キーに従属しているカラムは別表にする) 店舗ID 商品ID 価格

    S0001 AA01 300 S0002 AA01 300 S0002 AA02 400 • 部分関数従属 非キー(行を特定できない)が、候補キーに従属していること 店舗ID 商品ID S0001 AA01 S0002 AA01 S0002 AA02 商品ID 価格 AA01 300 AA02 400
  5. 3 | 第3正規化 • テーブル内の推移関数従属を排除 非キー→非キーの関数従属を排除する (=非キーに従属しているカラムは別表にする) • 推移関数従属 非キーが、別の非キーに従属していること

    商品ID 主原料 業者 産地 AA01 鶏肉 A牧場 宮城 AA02 羊肉 B牧場 兵庫 AA04 エビ C水産 愛媛 商品ID 主原料 業者 AA01 鶏肉 A牧場 AA02 羊肉 B牧場 AA04 エビ C水産 業者 産地 A牧場 宮城 B牧場 兵庫 C水産 愛媛
  6. 4 | 第4正規化 • 多値従属を排除 (概略)ひとつのIDに対して複数項目あるデータを、種類ごとにまとめる 決済ID 決済方法 商品コード K0001

    JCB AA01, DB01 K0002 VISA, 商品券 AA25, RP05 決済ID 決済方法 商品コード K0001 JCB AA01 K0001 JCB DB01 K0002 VISA AA25 K0002 VISA RP05 K0002 商品券 AA25 K0002 商品券 RP05 決済ID 決裁方法 K0001 JCB K0002 VISA K0002 商品券 決済ID 商品コード K0001 AA01 K0001 DB01 K0002 AA25 K0002 RP05
  7. 5 | ボイスコッド正規化 • 非キーから候補キーへの関数従属を排除 (=非キーに従属しているカラムは別表にする) 第3正規系からスタートする 店舗ID 商品ID 配送センター

    S0001 AA01 神奈川 S0002 AA01 栃木 S0002 AA02 東京1 S0003 AA04 東京2 店舗ID 配送センター S0001 神奈川 S0002 栃木 S0002 東京1 S0003 東京2 商品ID 配送センター AA01 神奈川 AA01 栃木 AA02 東京1 AA04 東京2
  8. 6 | 正規化の注意点 • 無損失分解 正規化/テーブル分割後にもとに戻せること 決済ID 商品ID 商品名 注文数

    K0001 AA01 辛味チキン 3 K0002 AA01 辛味チキン 2 K0003 AA02 アロスティチーニ(2本) 8 K0004 AA04 ポップコーンシュリンプ 10 決済ID 注文数 K0001 3 K0002 2 K0003 8 K0004 10 商品ID 商品名 AA01 辛味チキン AA02 アロスティチーニ(2本) AA04 ポップコーンシュリンプ
  9. 7 | 参考になったサイト ZDNET 「CRUD」 項 https://japan.zdnet.com/glossary/exp/CRUD/?s=4 mLAB 「情報無損失分解と関数従属性」 https://mukai-lab.info/pages/classes/database/chapter5/

    Qiita「正規化の要点を理解する」 @mochichoco (2021年3月12日最終更新) https://qiita.com/mochichoco/items/2904384b2856db2bf46c Qiita 「正規化について整理」 @dengzais8 (2023年1月9日最終更新) https://qiita.com/dengzais8/items/2aef61e3ddb0b1d1567e 工業大学生ももやまのうさぎ塾 うさぎでもわかるデータベースの正規化・正規系判定(基本情報・応用情報) https://www.momoyama-usagi.com/entry/info-database-seikika#1-3