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
39
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
94
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
Agentic Software Factoryに、すごく賢いIF文を。 / super smart IF statement into the Agentic Software Factory.
rkaga
8
2.3k
現場と育てるRailsモデリング 〜Spreadsheetから始めたモデル設計〜
siroemk
2
630
HTML-in-Canvasで作る未来のWeb UI表現
clockmaker
5
5.2k
Jetpack Compose Mechanisms
skydoves
3
820
作れる、でも消せるか?──安全に「枯らして消す」機能削除術 / Drain, Then Delete
chobishiba
2
800
Web Framework Benchmark Battle 2026, Any%
a_matsuda
2
2.5k
Domain-Driven Transformation
hschwentner
2
2.3k
Rでドレミ/Do-Re-Mi_with_R
florets1
0
130
[Rails World 2026] Durable orchestration on Rails: from continuation to workflow
palkan
1
750
作って学ぶSpring BootのAuto Configuration / JJUG Night Seminar 2026-10-19
rshindo
0
180
S3 TablesのIcebergデータに、AIエージェントからアクセスしてみた / 20261016developersio2026joetsu-accessing-iceberg-in-s3tables-via-agent
kasacchiful
PRO
0
170
PumaからFalconに移行したRailsアプリケーションでの実践
falcon8823
0
180
Featured
See All Featured
Rails Girls Zürich Keynote
gr2m
96
14k
Navigating the moral maze — ethical principles for Al-driven product design
skipperchong
2
630
We Have a Design System, Now What?
morganepeng
55
8.4k
Tips & Tricks on How to Get Your First Job In Tech
honzajavorek
1
800
Crafting Experiences
bethany
1
380
Groundhog Day: Seeking Process in Gaming for Health
codingconduct
0
420
Building Adaptive Systems
keathley
44
3.3k
Building a Modern Day E-commerce SEO Strategy
aleyda
45
9.3k
Self-Hosted WebAssembly Runtime for Runtime-Neutral Checkpoint/Restore in Edge–Cloud Continuum
chikuwait
0
890
How to make the Groovebox
asonas
2
2.5k
Navigating Algorithm Shifts & AI Overviews - #SMXNext
aleyda
1
1.7k
A Tale of Four Properties
chriscoyier
163
24k
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