Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
DBはそのままで、 ドメインモデルを分けた話
Search
8zca
July 31, 2026
Programming
40
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
DBはそのままで、 ドメインモデルを分けた話
8zca
July 31, 2026
More Decks by 8zca
See All by 8zca
APIの意義と向き合い チームで成長した軌跡
8zca
0
96
recoil
8zca
0
140
10min_elixir
8zca
0
48
Using react at Startup
8zca
0
360
質問サイトからみる Rubyに関する質問傾向 を調べてみたよ
8zca
0
58
Other Decks in Programming
See All in Programming
複雑なUIコンポーネントとの ⻑い付き合い⽅:波及するバグからテスト戦略を経て、安全な再設計へ
mixplace
0
430
Atomic Design, Enforced: Scaling Mobile Design Systems (next.app devCon / droidCon Berlin 2026)
steliosf
PRO
0
170
dotNET_vulnclicker_intro.pdf
deka_morita
0
150
コーディング自動化の次へ。人の介入をゼロにするファクトリーとサポートAIによる実践
timakin
5
4k
Kotlinの15年とServer-Side Kotlin
n_takehata
1
160
3回つくってわかった、 定期実行ジョブ基盤の本質情報
takai
0
520
残高管理から台帳サービスへの進化
artoy
1
210
The Rails Doctrine Decade
koic
2
600
エージェントを使い続けるためのメタワーク / Meta-work for keeping using the agent
rkaga
1
240
ChromeでローカルLLM
ryu1013
0
140
パスワード再設定メールのURLについて知っておこう
uyuki234
0
160
Lambda durable functionsでHuman in the Loopを楽に…楽に……
har1101
0
120
Featured
See All Featured
jQuery: Nuts, Bolts and Bling
dougneiner
66
8.6k
We Analyzed 250 Million AI Search Results: Here's What I Found
joshbly
2
2k
16th Malabo Montpellier Forum Presentation
akademiya2063
PRO
0
410
The AI Revolution Will Not Be Monopolized: How open-source beats economies of scale, even for LLMs
inesmontani
PRO
3
3.8k
Designing for Performance
lara
612
70k
AI Search: Where Are We & What Can We Do About It?
aleyda
0
8.1k
GraphQLの誤解/rethinking-graphql
sonatard
75
12k
Groundhog Day: Seeking Process in Gaming for Health
codingconduct
0
420
Utilizing Notion as your number one productivity tool
mfonobong
4
620
Self-Hosted WebAssembly Runtime for Runtime-Neutral Checkpoint/Restore in Edge–Cloud Continuum
chikuwait
0
890
HU Berlin: Industrial-Strength Natural Language Processing with spaCy and Prodigy
inesmontani
PRO
0
760
Efficient Content Optimization with Google Search Console & Apps Script
katarinadahlin
PRO
1
930
Transcript
DBはそのままで、 ドメインモデルを分けた話 DDDとモジュール分割、実際どうだった? 2026.07.30 / MORIWAKI Kazuya(株式会社スペースマーケット) 1
今日話すこと • Repositoryを分ける基準は、テーブルの形ではない ◦ • ドメインの意味・不変条件・更新責務の境界で決まる DBは1㍉も変えていません ◦ 100カラム超の既存テーブルはそのまま残して、モデルだけを分けた話 2
スペースマーケットとは スペースを借りたい「ゲスト」とスペースを貸したい「ホスト」をマッチングするサービス
前提:100カラムのテーブルという現実 10年の歴史の積み重ね! • hosts テーブル(ホストにまつわる情報)は 100カラム超 • 性質の異なる情報が、ひとつのテーブルに同居している ◦ 更新タイミング・更新主体・守るべき不変条件・ライフサイクル
◦ これが違えば、物理的には1テーブルでも別の関心事 基本情報 掲載審査 インボイス事業者 (今回のターゲット) その他 色が変わるところが、意味が変わるところ 4
課題:HostRepository#save で保存処理をカバー • 1回の save が、hosts の全カラムを UPDATE/INSERT していた ◦
• どの属性を本当に更新しているのか、コードから読めない、レビューで見切れない 影響範囲が、過度に大きい ◦ 実装の不便さに見えるが、これは設計のサインだった 5
あれ?わたしのドメイン大きすぎ・・? 実装の違和感は、 ドメイン境界が曖昧なサイン 6
インボイス事業者情報は、独立していた • ライフサイクルが違う ◦ • 参照される文脈が違う ◦ • ホスト情報登録後、別の導線から登録される 請求・会計の文脈で読まれる情報
守る不変条件が違う ◦ 登録番号の必須性など、ホスト基本情報とは別のルール だから、別のドメインモデルとして扱おう 7
どう分けたか:DBはそのまま、Repositoryを分ける • Entity と Repository を2つに分けた ◦ Host / HostInvoiceRegistration
HostRepository HostInvoiceRegistration Repository 基本情報・掲載審査など ※ここも分けるべきですが今スコープはそのまま インボイス事業者情報 hosts テーブル(変更なし)― 触るカラムが重ならないようにした アプリ層からは、異なる文脈として永続化されているように見える 8
ルール • • カラムの所有権を決める ◦ 各Repositoryは、自分のカラムしか読み書きしない ◦ 無関係なカラムを巻き込まない 同時更新の衝突はロックで守る ◦
ただしロックの粒度は行単位。ここは今も検討中 9
やってみてどうだった:よかったこと • カラムの所有権が決まった ◦ • 誰がどのカラムを触っていいかが定義された 影響範囲が閉じた ◦ レビュー観点が絞れる /
単体テストの書きやすさ向上 10
悩み:どう境界を定めるか • • 境界は「意図」である ◦ どういう目的でこの抽象を切り取るか。根拠はドメインの言語と不変条件にある ◦ これはどっちかな?という悩みは常につきまとう ▪ AIやチームと対話しよう。悩んだ分だけ解像度上がる
▪ あとから変えてもいい。育てよう AIとは相談できる。最後の決めは人間がやる ◦ 壁打ち・抽象化・整合性の検証・実装は任せられる。 線をどこに引くかは人間の仕事 11
どこまで分けるか:迷ったときの3観点 • 単体で意味のあるドメインか • 不変条件が独立しているか • 同一カラムを複数モデルが触らない設計にできるか 12
まとめ • 分割の是非を決めるのは、テーブル構造ではない ◦ ドメインの意味 / 不変条件 / 更新責務の境界 •
先にドメイン境界を定義すれば、分割は結果として決まる • 境界は意図。AIとは相談できるが、最後の決めは人間がやる 13