<< テーブル設計 データモデリングのエッセンス(1) | main | テーブル設計 データモデリングのエッセンス (3) >>

テーブル設計 データモデリングのエッセンス(2)

テーブルのタイプ

データベースに記録する情報の性格から、テーブルを三つのタイプに分類する。
・ビジネスイベント:受注、出荷
・ビジネスリソース:商品、顧客、店舗
・ビジネスルール:価格表、手数料、

これは、Eric Evans の Domain-Driven Design (DDD) の Responsibility Layers の考え方と同じです。

今回は、ビジネスイベント系のテーブルの設計原則をとりあげる。

ビジネスイベントの記録

受注や出荷は、ビジネスイベントが発生した時点の記録です。このタイプのテーブル(情報)は、過去の事実の記録ですから、一度作成(インサート)したら、後から、更新や削除はしない。このテーブルに許される操作は、インサートと参照のみにする。

受注取消は、受注取消テーブルに記録する。受注テーブルに論理削除フラグを作って更新したり、受注テーブルの物理削除はしない。過去の記録は書き換えない。

受注変更は、受注取消テーブルに取消を記録し、受注テーブルに受注レコードを新規に作成する。受注レコードは更新しない。レコードの削除もしない。有効な受注は( 受注 MINUS 受注取消 )で導出する。

出荷は、出荷テーブルに記録する。受注テーブルに出荷フラグや出荷日付カラムは作らない。

ビジネスイベント系のテーブルの設計原則

受注は受注、出荷は出荷、受注取消は受注取消のそれぞれの用途別にテーブルを作成する。
「テーブルの役割・用途は一つ」の設計原則です。

発生した事実の記録は発生時点での作成(インサート)だけにする。後から、更新したり、削除したりない。

取消は、取消イベントとして記録する。
変更は、取消+追加で記録する。

予定も過去の記録である

予定日など未来に関する情報も「予定した」という過去の事実として記録する。
予定変更になった場合も、予定取消を記録し、変更後の予定を新規にインサートする。

受注残の管理

( 受注 MINUS 受注取消 ) MINUS 出荷 

過去の事実の記録から、受注残を論理的に導出する。

業務量が多いと、このやり方は性能面で問題が起きる。解法の一つは、受注残テーブルを別途作成する。

受注残テーブルは、トリガーを使って、最新の状態に維持する。

受注テーブルにレコード作成時にトリガー、受注残テーブルにレコードを追加。
受注取消のレコード作成時に、トリガーで、受注残テーブルから該当する受注を物理的に削除する。
出荷レコード作成時に、トリガーで、受注残テーブルから出荷した受注を物理的に削除する。

アプリケーション開発者には、受注残テーブルは参照オンリーのテーブルになる。

入庫・出庫・在庫数

似たパターンに、入庫・出庫・在庫がある。論理的には、過去のすべての入庫データと出庫データから、現在の在庫数を導出できる。

毎回導出していたのでは、処理性能の問題があるので、トリガーで、在庫数を自動更新する。

導出テーブル

受注残や在庫数は、トリガーで自動的に更新する導出テーブルです。論理データモデルとしては、対象外。過去の事実の記録テーブルだけあれば、必要な情報は、論理的に導出可能です。

受注残や在庫数は、インデックスと同じです。つまり、性能面などを考えると必要ですが、論理的には必要ない。

インデックスは、ドロップしても再作成できます。受注残テーブルや在庫数テーブルも同じで、ドロップしても、ビジネスイベントの記録テーブルから、再作成可能です。

この設計の利点

・テーブルの役割が明確。わかりやすいデータモデルになる。
・設計・開発・テスト・保守が簡単になる。
・上書き更新や削除による、過去の記録の消失が発生しない。
・速い (小さいレコードで追加のみの処理は速いです)

コメント
コメントする









この記事のトラックバックURL
トラックバック
calendar
   1234
567891011
12131415161718
19202122232425
2627282930  
<< November 2017 >>
システム設計日記を検索
プロフィール
リンク
システム開発日記(実装編)
有限会社 システム設計
twitter @masuda220
selected entries
recent comment
  • 番号より名前。 ニーモニックコードより名前。 【パターン】
    師子乃 (03/10)
  • Smart UI が優れている?
    masuda220 (03/10)
  • Smart UI が優れている?
    kagehiens (03/09)
  • オブジェクト指向プログラミングの教え方?
    masuda220 (12/05)
  • オブジェクト指向プログラミングの教え方?
    ZACKY (12/04)
  • 「オブジェクトの設計力」 スキルアップ講座やります
    masuda220 (08/14)
  • 「オブジェクトの設計力」 スキルアップ講座やります
    kompiro (08/14)
  • 「オブジェクトの設計力」 スキルアップ講座やります
    masuda220 (06/13)
  • 「オブジェクトの設計力」 スキルアップ講座やります
    JHashimoto (06/13)
  • 「オブジェクトの設計力」 スキルアップ講座やります
    masuda220 (02/28)
recent trackback
categories
archives
others
mobile
qrcode
powered
無料ブログ作成サービス JUGEM