楽々ERDレッスン:テーブル設計実践6

テーブル設計の流れ

テーブル設計の流れの概要にめちゃくちゃわかりやすくテーブル設計の手順が書かれていたので記載。これをベースに作業を進める。

  1. メインとなるテーブル名を出す
  2. 「誰が・何が」を考えてテーブル名を出す
  3. 「誰を・何を」を考えてテーブル名を出す
  4. 各テーブルのカラムを出す
  5. 残ってる、表現できていない情報があれば、テーブルになるか、カラムに追加するかを考える
  6. 関連を入れる
  7. 制約とデフォルト値とINDEXを考える

ガスの請求書

ガスの請求書のテーブル設計を行う。題材は次のもの。

image.png

メインとなるテーブル名を出す(イベント系エンティティを洗い出す)

この紙の目的を考えると、『ガス使用量を検針するもの』なので、メインとなるイベントは『検針』となる

image.png

「誰が・何が」、「誰を・何を」を考えてテーブル名を出す(リソース系エンティティを洗い出す)

『ガス会社』が『ガス使用量』の検針をする。ただ、ガス会社をデータとして記録する必要はないので、『ガス使用量』のみをリソース系エンティティに追加。

image.png

各テーブルのカラムを出す

検針表から見た目通りにカラムを設定していく。

image.png

表現できていない情報を、テーブルにするか、カラムに追加するかを考える

下記の項目がまだ表現できていない。

  • 顧客情報
  • 前月の指示数
  • 前年の情報(使用量、使用日数)
  • 基本料金

前月や前年情報は自己参照っぽい気がするので、エンティティやカラムではなく関連で示すと思うので、顧客情報と基本料金を追加。また、基本料金は、ある程度決まっているようだけど、異なる料金体系になることもあるっぽいので、見出し明細形式にしておく。

image.png

関連を入れる

関連を入れていく。具体的なデータ(検針データがどのように管理されるかを想像しながら)を考えながら関係や多重度を考えていく。外部参照キーも入れていく。前月と前年を関連を入れてみたけど、1体1対応になると思うので、そのように記述してみたけど、これでいいのか微妙😅

とりあえず解答を確認する。

image.png

参考:解答例

image.png

今回は答えが違いすぎて泣けました😭

今回の解答からの得たポイントは次の3つ。

  • テーブルで一緒にしなくても、ビューで表現してしまえば良い(ビューで仮想テーブルを作る)

    今月-前月、当年-前年を自己参照として表現しようとしたけどそうではない。データとしてはいずれも全く同じ属性なので、データとして管理するものは同じで良い(可逆性のある導出項目の削除)。どうデータを見せるかの部分は、ビューで表現する。今回の例だと、検針テーブルを今回分と前回分のあたかも別テーブルと存在するかのようにビューを使ってあげて表現する。

  • 他のデータから計算できるものは可能な限り排除(可逆性のある導出項目の削除)

    今回の例だと、使用期間については『前回検針日翌日から今回検針日までの日数』として計算でき、次回検針日についても『予定として1ヶ月後』となっているので、いずれも検針日さえデータとして残っていれば良いので、当該のものは不要になる。

参考