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

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

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

お題

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

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

やってみよう!

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)