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

論理設計_.pdf

 論理設計_.pdf

Avatar for quoise

quoise

June 14, 2019

More Decks by quoise

Other Decks in Technology

Transcript

  1. アジェンダ ⮚ DBについて ⮚ RDBMSについて ⮚ 論理設計について ⮚ 正規化とキーについて ⮚

    特殊なキーについて ⮚ ER図 ⮚ 論理設計のアンチパターンについて ⮚ 最後に 5
  2. 16

  3. 18

  4. 表計算のテーブルの例 項目1 項目2 項目3 項目4 1 カントー 1 ヒトカゲ Charmander

    3 関東 #001 キモリ Treecko 2 ジョウト #004 キティちゃん 1 カントー #016 ポッポ Pidgey 32
  5. 表計算のテーブル 項目1 項目2 項目3 項目4 1 カントー 1 ヒトカゲ Charmander

    3 関東 #001 キモリ Treecko 2 ジョウト #004 キティちゃん 1 カントー #016 ポッポ Pidgey 整合性がない形に見えませんか? 36
  6. RDBMSのテーブル 図鑑No 名前 英語名 #004 ヒトカゲ Charmander #252 キモリ Treecko

    #155 ヒノアラシ Cyndaquil #016 ポッポ Pidgey 整合性が取れてるように見えませんか? 37
  7. 最初のは属性もバラバラで〇〇テーブル と特定し辛い 項目1 項目2 項目3 項目4 1 カントー 1 ヒトカゲ

    Charmander 3 関東 #001 キモリ Treecko 2 ジョウト #004 キティちゃん 1 カントー #016 ポッポ Pidgey 40
  8. 図鑑No 名前 英語名 #004 ヒトカゲ Charmander #252 キモリ Treecko #155

    ヒノアラシ Cyndaquil #016 ポッポ Pidgey テーブルの構成 カラム(列) フィールド レコード (行) 45
  9. 図鑑No 名前 英語名 #004 ヒトカゲ Charmander #252 キモリ Treecko #155

    ヒノアラシ Cyndaquil #016 ポッポ Pidgey どれ探せばいいんだ よ! 47
  10. 図鑑No 名前 英語名 #004 ヒトカゲ Charmander #252 キモリ Treecko #155

    ヒノアラシ Cyndaquil #016 ポッポ Pidgey 他の属性を全て特定できるキーを探す 主キー(PK:プライマリーキー) 53
  11. 図鑑No 名前 英語名 #004 ヒトカゲ Charmander #004 キモリ Treecko #155

    ヒノアラシ Cyndaquil #016 ポッポ Pidgey ルール①:主キーの重複は許されない 主キー(PK) 登録不可 55
  12. 図鑑No 名前 英語名 #004 ヒトカゲ Charmander NULL キモリ Treecko #155

    ヒノアラシ Cyndaquil #016 ポッポ Pidgey ルール②:主キーにNULLは許されない 主キー(PK) 登録不可 56
  13. 図鑑No 名前 英語名 地方名 #004 ヒトカゲ Charmander カントー #252 キモリ

    Treecko ホウエン #155 ヒノアラシ Cyndaquil ジョウト #016 ポッポ Pidgey カントー 外部キーについて 外部キー(FK:フォーリンキー) 地方名 カントー ホウエン ジョウト 58
  14. 図鑑No 名前 英語名 地方名 #004 ヒトカゲ Charmander カントー #252 キモリ

    Treecko ホウエン #155 ヒノアラシ Cyndaquil ジョウト #740 ケケンカニ Crabominable アローラ 外部キー制約 外部キー(FK) 地方名 カントー ホウエン ジョウト 登録不可 59
  15. 正規化の説明用に ポケモンテーブルを変えてみました ポケモンテーブル(拡張版) 作品世代 地方名 No.(地方別) 名前 英語名 タイプID タイプ名

    1 カントー #004 ヒトカゲ Charmander A ほのお 3 ホウエン #001 キモリ Treecko B くさ 2 ジョウト #004 ヒノアラシ Cyndaquil A ほのう 1 カントー #016 ポッポ Pidgey F ひこう 81
  16. まずは主キーを探す ポケモンテーブル 作品世代 地方名 No.(地方別) 名前 英語名 タイプID タイプ名 1

    カントー #004 ヒトカゲ Charmander A ほのう 3 ホウエン #001 キモリ Treecko B くさ 2 ジョウト #004 ヒノアラシ Cyndaquil A ほのう 1 カントー #016 ポッポ Pidgey F ひこう 主キー(複合主キー) 82
  17. 第一正規形 ⮚ フィールドには1つの値しか入れないようにする(スカラ値を満たす) ⮚ テーブルと呼べるものは既に第一正規系を満たしている ポケモンテーブル 作品世代 地方名 No.(地方 別)

    名前 英語名 タイプID タイプ名 1 カントー #004 ヒトカゲ Charmander A ほのう 3 ホウエン #001 キモリ Treecko B くさ 2 ジョウト #004 ヒノアラシ Cyndaquil A ほのう 1 カントー #016 ポッポ Pidgey F ひこう 83
  18. それができない ⮚ 主キーにNULLは登録できないから ポケモンテーブル 作品世代 地方名 No.(地方別) 名前 英語名 タイプID

    タイプ名 1 カントー #004 ヒトカゲ Charmander A ほのう 3 ホウエン #001 キモリ Treecko B くさ 2 ジョウト #004 ヒノアラシ Cyndaquil A ほのう 1 カントー #016 ポッポ Pidgey F ひこう 8 ガラル ??? ??? ??? ??? ??? 88
  19. ここで行う第二正規化 ⮚ 部分的関数従属を取り除く行為です ポケモンテーブル 作品世代 No.(地方 別) 名前 英語名 タイプID

    タイプ名 1 #004 ヒトカゲ Charmander A ホノオ 3 #001 キモリ Treecko B クサ 2 #004 ヒノアラシ Cyndaquil A ホノオ 1 #016 ポッポ Pidgey F ヒコウ 地方テーブル 作品世代 地方名 1 カントー 3 ホウエン 2 ジョウト 8 ガラル 地方テーブルとして切り出す 89
  20. まず関数従属ってなんでしょう? y = f(x):とある値が決まれば他の値が決まること ポケモンテーブル 作品世代 地方名 No.(地方別) 名前 英語名

    タイプID タイプ名 1 カントー #004 ヒトカゲ Charmander A ホノオ 3 ホウエン #001 キモリ Treecko B クサ 2 ジョウト #004 ヒノアラシ Cyndaquil A ホノオ 1 カントー #016 ポッポ Pidgey F ヒコウ 90
  21. 部分的関数従属を見つける ポケモンテーブル 作品世代 地方名 No.(地方 別) 名前 英語名 タイプID タイプ名

    1 カントー #004 ヒトカゲ Charmander A ホノオ 3 ホウエン #001 キモリ Treecko B クサ 2 ジョウト #004 ヒノアラシ Cyndaquil A ホノオ 1 カントー #016 ポッポ Pidgey F ヒコウ とりあえず部分的に主キーから特定できるものを見つける 作品世代から地方名を割り出せる(部分的関数従属) 91
  22. ここで行う第二正規化 ⮚ 部分的関数従属を取り除く行為です ポケモンテーブル 作品世代 No.(地方 別) 名前 英語名 タイプID

    タイプ名 1 #004 ヒトカゲ Charmander A ホノオ 3 #001 キモリ Treecko B クサ 2 #004 ヒノアラシ Cyndaquil A ホノオ 1 #016 ポッポ Pidgey F ヒコウ 地方テーブル 作品世代 地方名 1 カントー 3 ホウエン 2 ジョウト 8 ガラル 地方テーブルとして切り出す 92
  23. それもできない ⮚ これも主キーにNULLは登録できないから ポケモンテーブル(第二正規化後) 作品世代 No.(地方別) 名前 英語名 タイプID タイプ名

    1 #004 ヒトカゲ Charmander A ホノオ 3 #001 キモリ Treecko B クサ 2 #004 ヒノアラシ Cyndaquil A ホノオ 1 #016 ポッポ Pidgey F ヒコウ 6 ? ? ? Z フェアリー 96
  24. ここで行う第三正規化 ⮚やってることは第二正規形とほぼ同じです タイプテーブル タイプID タイプ名 A ホノオ B クサ F

    ヒコウ ポケモンテーブル 作品世代 No.(地方 別) 名前 英語名 タイプID 1 #004 ヒトカゲ Charmander A 3 #001 キモリ Treecko B 2 #004 ヒノアラシ Cyndaquil A 1 #016 ポッポ Pidgey F 地方テーブル 地方ID 地方名 1 カントー 3 ホウエン 2 ジョウト タイプテーブルとして切 り出す 97
  25. 推移的関数従属を見つける 主キーからタイプIDを割り出せる、そのタイプIDからタイプ名を 割り出して分離する(推移的関数従属) 作品世代 地方名 No.(地方別) 名前 英語名 タイプID タイプ名

    1 カントー #004 ヒトカゲ Charmander A ホノオ 3 ホウエン #001 キモリ Treecko B クサ 2 ジョウト #004 ヒノアラシ Cyndaquil A ホノオ 1 カントー #016 ポッポ Pidgey F ヒコウ 98
  26. 追加! サロゲートキー ポケモンテーブル(第3正規化後) ID 作品世代 No.(地方別) 名前 英語名 タイプID 1

    1 #004 ヒトカゲ Charmander A 2 3 #001 キモリ Treecko B 3 2 #004 ヒノアラシ Cyndaquil A 4 1 #016 ポッポ Pidgey F ⮚ “業務”上は意味を持たない連番するキーの事です ⮚ このカラム1つでレコードの特定が可能(1意)でめちゃくちゃ便利です ⮚ 多くのwebアプリケーションフレームワークではデフォルトで付いてきます 102
  27. さっきまでのキーはナチュラルキー ポケモンテーブル(第三正規化後) 作品世代 No.(地方別) 名前 英語名 タイプID 1 #004 ヒトカゲ

    Charmander A 3 #001 キモリ Treecko B 2 #004 ヒノアラシ Cyndaquil A 1 #016 ポッポ Pidgey F ⮚ HDへの負担が少なくなる ⮚ “業務”上意味のあるキー 103
  28. 106

  29. ER図とは Entity Relationship Diagram 実体 関連 モデル ⮚ テーブルの関係性を図示するものです ⮚

    僕はこれないと物作れません ⮚ ポピュラーで分かりやすいIE記法(簡易版)で説明 114
  30. エンティティを抽出する ポケモンテーブルは既に正規化を行い エンティティを抽出できています =ボトムアップアプローチ タイプテーブル タイプID タイプ名 A ホノオ B

    クサ F ヒコウ ポケモンテーブル 作品世代 No.(地方 別) 名前 英語名 タイプID 1 #004 ヒトカゲ Charmander A 3 #001 キモリ Treecko B 2 #004 ヒノアラシ Cyndaquil A 1 #016 ポッポ Pidgey F 地方テーブル 作品世代 地方名 1 カントー 3 ホウエン 2 ジョウト 115
  31. リレーションを検討する このテーブルたちがどんな関係性にあるかを考えて 図時していきます タイプテーブル タイプID タイプ名 A ホノオ B クサ

    F ヒコウ ポケモンテーブル 作品世代 No.(地方 別) 名前 英語名 タイプID 1 #004 ヒトカゲ Charmander A 3 #001 キモリ Treecko B 2 #004 ヒノアラシ Cyndaquil A 1 #016 ポッポ Pidgey F 地方テーブル 地方ID 地方名 1 カントー 3 ホウエン 2 ジョウト 118
  32. ER図ではこう表します タイプ ID タイプ名 A ホノオ B クサ F ヒコウ

    N ノーマル 作品世代 No.(地方別) 名前 英語名 タイプID 1 #004 ヒトカゲ Charmander A 2 #004 ヒノアラシ Cyndaquil A ⮚ 一つのタイプは複数のポケモンを持つというアプローチ 121
  33. こんなことするのは悪手です タイプテーブル タイプ ID タイプ名 A ホノオ B クサ F

    ヒコウ N ノーマル ポケモンテーブル 作品世代 No.(地方 別) 名前 英語名 タイプID 1 #016 ポッポ Pidgey F, N ⮚ スカラ値原則に反する 124
  34. 1対1 地方ID No.(地方 別) 名前 英語名 タイプID 登場回トレ ーナー トレーナー

    性格 … トレーナー 英語名 1 #004 ヒトカゲ Charmand er A ダイスケ 冷酷 … Daimian ヒトカゲレコードにアニメポケモンでの ヒトカゲの“初登場回の所持トレーナー”属性を追加したとします 127
  35. こういう風にリレーションを張ります 地方ID No.(地方別) 名前 英語名 タイプID 1 #004 ヒトカゲ Charmander

    A 地方ID No.(地方別) 登場回トレ ーナー トレーナー 性格 … トレーナー 英語名 1 #004 ダイスケ 冷酷 … Daimian 128
  36. 最終的ER図はこんな感じになります タイプテーブル タイプID タイプ名 ポケモンテーブル 作品世代 No.(地方 別) 名前 英語名

    タイプID 地方テーブル 地方ID 地方名 トレーナーテーブル 地方ID No.(地方別) 登場回トレ ーナー トレーナー 性格 … トレーナー 英語名 ポケモンタイプテーブル 作品世代 No.(地方別) タイプID 131
  37. 解決策 タイプテーブル タイプ ID タイプ名 A ホノオ B クサ F

    ヒコウ N ノーマル ポケモンテーブル 作品世代 No.(地方 別) 名前 英語名 タイプID 1 #016 ポッポ Pidgey F, N このテーブルを思い出して下さい 143
  38. 連関テーブルを用いれば解決できます 作品世代 No.(地方 別) タイプID 1 #016 F 1 #016

    N タイプ ID タイプ名 A ホノオ B クサ F ヒコウ N ノーマル 作品世代 No.(地方 別) 名前 英語名 1 #016 ポッポ Pidgey 144
  39. 論理削除式でコードが塗れます Sample.Where(x => x.DeleteFlag == 0); Sample2.Where(x => x.DeleteFlag ==

    0); Sample3.Where(x => x.DeleteFlag == 0); . . . Sample100.Where(x => x.DeleteFlag == 0); Sample.where(DeleteFlag : 0) Sample.where(DeleteFlag : 0) . . . Sample.where(DeleteFlag : 0) 149