Upgrade to Pro — share decks privately, control downloads, hide ads and more …

DBはそのままで、 ドメインモデルを分けた話

Avatar for 8zca 8zca
July 31, 2026

DBはそのままで、 ドメインモデルを分けた話

Avatar for 8zca

8zca

July 31, 2026

More Decks by 8zca

Other Decks in Programming

Transcript

  1. 前提:100カラムのテーブルという現実 10年の歴史の積み重ね! • hosts テーブル(ホストにまつわる情報)は 100カラム超 • 性質の異なる情報が、ひとつのテーブルに同居している ◦ 更新タイミング・更新主体・守るべき不変条件・ライフサイクル

    ◦ これが違えば、物理的には1テーブルでも別の関心事 基本情報 掲載審査 インボイス事業者 (今回のターゲット) その他 色が変わるところが、意味が変わるところ 4
  2. 課題:HostRepository#save で保存処理をカバー • 1回の save が、hosts の全カラムを UPDATE/INSERT していた ◦

    • どの属性を本当に更新しているのか、コードから読めない、レビューで見切れない 影響範囲が、過度に大きい ◦ 実装の不便さに見えるが、これは設計のサインだった 5
  3. インボイス事業者情報は、独立していた • ライフサイクルが違う ◦ • 参照される文脈が違う ◦ • ホスト情報登録後、別の導線から登録される 請求・会計の文脈で読まれる情報

    守る不変条件が違う ◦ 登録番号の必須性など、ホスト基本情報とは別のルール だから、別のドメインモデルとして扱おう 7
  4. どう分けたか:DBはそのまま、Repositoryを分ける • Entity と Repository を2つに分けた ◦ Host / HostInvoiceRegistration

    HostRepository HostInvoiceRegistration Repository 基本情報・掲載審査など ※ここも分けるべきですが今スコープはそのまま インボイス事業者情報 hosts テーブル(変更なし)― 触るカラムが重ならないようにした アプリ層からは、異なる文脈として永続化されているように見える 8
  5. 悩み:どう境界を定めるか • • 境界は「意図」である ◦ どういう目的でこの抽象を切り取るか。根拠はドメインの言語と不変条件にある ◦ これはどっちかな?という悩みは常につきまとう ▪ AIやチームと対話しよう。悩んだ分だけ解像度上がる

    ▪ あとから変えてもいい。育てよう AIとは相談できる。最後の決めは人間がやる ◦ 壁打ち・抽象化・整合性の検証・実装は任せられる。 線をどこに引くかは人間の仕事 11
  6. まとめ • 分割の是非を決めるのは、テーブル構造ではない ◦ ドメインの意味 / 不変条件 / 更新責務の境界 •

    先にドメイン境界を定義すれば、分割は結果として決まる • 境界は意図。AIとは相談できるが、最後の決めは人間がやる 13