そこに仁義はあるのか(仮)

略してそこ仁!

アーキ部:テーブル設計をやってみよう!

毎週金曜の定時後に弊社でアーキ部なるものが開催されています(✌'ω' ✌)
スピードラーニング的に@さんのお話を聞く会ですが、今週はテーブル設計がテーマでした!

この記事がすごく良かったので、触発されてブログ書く!!!
developer.hatenastaff.com

お題

↓のお題が出て、テーブル設計を考えてみるはなし。

要求仕様は以下のとおり。
・宿の部屋は、シングルやツインのような部屋タイプが設定できます。
・宿側で宿泊プランを設定できます。宿泊プランは適用される日付が設定できます。
・プランには複数の部屋タイプが含まれることがあります。
・宿側でプラン・部屋タイプ・宿泊日ごとに宿泊費の設定ができます。
・カスタマはプラン・部屋タイプ・宿泊日を指定して宿泊予約ができます。
・予約は会員でも非会員でも可能です。
・また、会員・非会員に関わらず、宿をお気に入りに登録できます。
・予約のキャンセルに関して、プランごとにキャンセル料のルールを設定できます。
・キャンセルのルールは、宿泊の○日前までは宿泊料の×%の支払いといったものです。
・売上集計のため、宿泊実績・キャンセル実績(請求)と、支払いの実績をマッチング出来なくてはいけません。
・様々な条件から宿の検索ができますが、空きのないプランは検索結果に表示されません。

画像がすごく多い記事になった。。。

Input

以前に公開されたイミュータブルデータモデルがInputでした!

www.slideshare.net

やってみよう!

Step1 エンティティの抽出

ふむ。。。
要求仕様の動詞と名詞を抜き出すとこういう感じかな。。。(動詞と名詞の区別難しい!!!)
あとは、現段階でわかる属性とか候補キーについても書いていこう。。。

要求仕様は以下のとおり。
・"宿(名)"の"部屋(名)"は、シングルやツインのような"部屋タイプ(名)"が設定できます。
・宿側で"宿泊プラン(名)"を設定できます。宿泊プランは適用される日付が設定できます。
・プランには複数の部屋タイプが含まれることがあります。
・宿側でプラン・部屋タイプ・宿泊日ごとに宿泊費の設定ができます。( ˊ࿁ˋ ) ᐝ(このあたりはプランの項目になる気がする。。。)
・"カスタマ(名)"はプラン・部屋タイプ・宿泊日を指定して宿泊予約ができます。( ˊ࿁ˋ ) ᐝ(プランとカスタマを結びつける感じかな。。。)
・"予約(動)"は会員でも非会員でも可能です。( ˊ࿁ˋ ) ᐝ(会員と非会員はカスタマに含まれる。)
・また、会員・非会員に関わらず、宿を"お気に入りに登録(動)"できます。
・予約のキャンセルに関して、プランごとにキャンセル料の"ルール(名)"を設定できます。( ˊ࿁ˋ ) ᐝ(キャンセルは予約したものの種類になるかな。。。)
・キャンセルのルールは、宿泊の○日前までは宿泊料の×%の支払いといったものです。
・売上集計のため、"宿泊実績・キャンセル実績(請求)(名)"と、"支払い(名)"の実績をマッチング出来なくてはいけません。
・様々な条件から宿の検索ができますが、空きのないプランは検索結果に表示されません。( ˊ࿁ˋ ) ᐝ(プランと予約の関連付けから計算する感じかな。。)

これをエンティティとして書き出すとこんな感じかな?

f:id:syobochim:20160904135606p:plain

Step2 エンティティの分類

こんな感じかな?
宿泊プランは日時(適用日時)があるからイベントにしてみたけど、なんか違和感があるな。。。
→コメントをいただき変えてみました。やっぱりリソースの方がしっくりきますね。

f:id:syobochim:20160907201338p:plain

Step3 イベントエンティティにはひとつの日付しかもたないようにする

これはもう出来ているから飛ばします。

Step4 リソースに隠されたイベントを抽出する

更新日付はないので、これも飛ばします。

Step5 非依存型リレーションシップを交差エンティティにする

ざっとリレーションを引いてみるとこんな感じかな。
サブタイプって、物理設計するときにはどうなるんだろ。。。?

サブタイプなど、リレーションの説明はココに載ってる。
ITエンジニアのスキル向上ゼミナール - 【初級】ゼロから学ぶDOA 第2回:ITpro

何がリソースで何がイベントわかりやすいように、リソースにはエンティティのあとにR、イベントにはテーブル名のあとにEをつけてみた。
リソース同士の非依存リレーションをなくすためにタイプ設定エンティティを追加しました。
( ˊ࿁ˋ ) ᐝ(Cacooでデータモデル書くの辛い感じあるし、みなさんさらっとテーブル設計するときに使っているツール教えてください。。。)

f:id:syobochim:20160907201447p:plain

リソース同士の非依存リレーションも時系列を無視したイベントも無いので、これで完成(✌'ω' ✌)

やってみよう2

スライドの参考文献の楽々ERDレッスンではレシートを使ってデータモデルの練習をしていたので、それもやってみる。

この前の飲み会のレシート!
f:id:syobochim:20160904122538p:plain

Step1 エンティティの抽出

Step2 エンティティの分類

Step1とStep2を一気にやっちゃう。

f:id:syobochim:20160905095135p:plain

Step3 イベントエンティティにはひとつの日付しかもたないようにする

Step4 リソースに隠されたイベントを抽出する

これは出来ているのでスキップ

Step5 非依存型リレーションシップを交差エンティティにする

リレーションをつけてみた。
さらっとつけただけだけど、時系列が反対になっているところもないのでこれで完成(✌'ω' ✌)
( ˊ࿁ˋ ) ᐝ(かなりサッパリしたテーブル設計になったな。。。)

f:id:syobochim:20160905095220p:plain

レシートからだとこれくらいのエンティティになる気がするけど、今回は無かった店舗限定メニューとか考えていくと、なかなか難しい感じですな。

参考

スライドにも載っている参考文献!
持っていて読んだけどわかりやすい!!

楽々ERDレッスン (CodeZine BOOKS)

楽々ERDレッスン (CodeZine BOOKS)