データモデリングとドメイン駆動設計の違いは何か
データモデリングとドメイン駆動設計の違いは何かを考えている。
アイデア段階で書き殴りのメモ。
【参考】
業務ロジックをデータモデリングはどこまで表現できるか?: プログラマの思索
システム開発・刷新のための データモデル大 | 渡辺 幸三 |本
【1】問題設定
僕は、データモデリングもドメイン駆動設計もどちらも好きだ。
データモデリングは生産管理や販売管理などの具体的な業務ドメイン知識をベースに、どんなER図を描くべきか、具体的な実現方法まで示唆してくれる。
ドメイン駆動設計は、オブジェクト指向設計をベースに、どんなプログラムに実装すべきかまで具体的な実装方法まで示唆してくれる。
しかし、双方の考え方や価値観には大きな相違があるように思える。
たとえば、クラウド上でシステム構築するのが当たり前の現代では、ドメイン駆動設計はマイクロサービス設計につながる設計手法として再定義されているように思える。
一方、データモデリングの手法は20年以上前のやり方と全く変わらず、今のシステム設計の文脈で置き換えられる内容が伴っていないために、古臭い手法のように感じてしまう。
【2】データモデリングの観点ではマイクロサービス設計とは何なのか?
では、マイクロサービス設計やドメイン駆動設計の考え方をデータモデリングの観点で言い換えるとどんな説明になるか?
データモデリングはどんな新しい観点をもたらしてくれるのか?
【3】データモデリングのパターンやイディオムは何か?
ドメイン駆動設計ではパターンやイディオムがあって共通言語になっている。
開発者同士で会話する時に認識を共有できる。
たとえば、リポジトリ、集約、境界づけられたコンテキスト、など。
一方、データモデリングでは、関数従属性ぐらいしか概念がなく、モデリングに関する共通言語がないように思う。
だから、関数従属性というメタ的な内容でしか話せず、生産管理や販売管理、会計などの特定の業務領域で具体的な議論にはまり込んでしまい、何かすごいことが分かった気がするのに、それを上手く伝えられていないと思う。
データモデリングでも重要な概念はあるので、パターンやイディオムを提示すべきではないか。
そうすれば、開発者同士で共通言語を用いて議論できると思う。
業務ロジックをデータモデリングはどこまで表現できるか?: プログラマの思索
パターンやイディオムとしてあげて欲しいキーワードを挙げておく。
パターン言語にある状況・問題・フォース・解決方法・効果として整理できるはず。
・2次識別子とボイスコッド正規化
2次識別子はもう一つの主キーなので、ボイスコッド正規化せざるを得ない。
・2次識別子とテーブルの抽象化・統合化
具体例は動的参照関係、テーブルの派生関係になる
・2次識別子とサロゲートキー
複合主キーを2次識別子にする
・サロゲートキーと強属性
2次識別子(代替キー、Alternative key)は強属性(追加されたら削除されるまで更新不可)になる
・派生関係
たとえば品番、取引先
オブジェクト指向の継承関係とは異なる観点を明確化したい
・導出属性(作出属性)
たとえば、在庫数とか
渡辺式ER図では、導出属性をマスタ(リソース)に配置する例が多い
リソースやイベントでない場合、サマリテーブルとしてバッチ処理で作る
・イベントとリソースの見分け方
テーブルをイベントとリソースで区別できれば、ER図での配置基準が明確になる
イベントには日付がある
・イベントの先行・後続関係の見分け方
イベントのテーブルに順序関係が発生し、業務フローを書き起こせる
データモデルから業務フローをイメージできるか
ER図を見れば、業務フローを具体的にイメージできる
ER図をベースに、業務フローやDFDを作成できるはず
・サマリテーブル、集計テーブルの作り方
どのイベントからサマリテーブルや集計テーブルを作るのか?
DWHの設計手法を整理できるか?
・動的参照関係と暗黙的リレーションシップ
複数のテーブルを結合したときに、参照関係が発生する
暗黙的リレーションシップになる
ER図だけでは読解しづらく、開発基盤の上で動的参照関係を実現するしかない
・時限NULL
レコード生成時はNULLだが、業務イベントを通じて値がセットされる
一時的なNULLの項目なので、NULLの項目であっても存在を許す
・再帰構造とLLC
LLC(Low Level Code)は、再帰となるツリー構造の深さを表す
LLCを使って再帰構造のロジックをプログラム上で実装しやすくする
・もう1つの再帰構造
階層構造は入れ子集合を使うと、ツリー構造をRDBに綺麗にマッピングできる
・フィーチャオプション
テーブルに項目を横持ちで持たせるのではなく、縦持ちで持たせる構造にする
リソース(マスタ)のテーブル設計で使われる
◯区分、◯種別が項目で横持ちに増えるのを防ぐ
・制約条件や業務ロジックの表現
業務のルール、業務ロジックを関数従属性を使って表現する
業務ルールは、特定の組み合わせや特定の性質で表現される場合が多い
そういう事象は、レコードという命題で表現されるので、関数従属性として表現されるべき
渡辺式ER図では推移的関数従属を参照関係を使って上手く排除している
・◯◯区分や◯◯ステータスは状態遷移を表す
テーブルにある◯◯区分や◯◯ステータスは、状態遷移を表すので状態遷移図を発生させる
◯◯区分や◯◯ステータスは、開発基盤の上では、条件分岐を発生させる
・ActiveRecordとORマッピング、ORインピーダンスマッチング
オブジェクト指向プログラミングとリレーショナルデータベースは異なるデータモデルを持つ。
ActiveRecordはORインピーダンスマッチングを解決する一つの手法







最近のコメント