DB 設計の軸 2026 ─ ドメイン駆動と特性駆動の二つの流派を行き来する 19 章
DB 設計の二つの流派(ドメイン駆動 vs 特性駆動)を対比軸として、OLTP / OLAP / Cache / NoSQL / Stream / NewSQL の 6 ワークロードを本質編 + 設計編で深掘りし、ドメインから使われる側=共通基盤の DB 設計を踏み込んだ上で、両派を行き来する判断軸を提示する 19 章
はじめに ─ DB の形は最後に決められるのか、それとも最初に決まるのか
こんな違和感を、設計のたびに感じていないか
新しいサービスを設計する場面。あなたの手元にはユースケースとドメインモデルがある。Aggregate を引き、Bounded Context を切り、Repository を定義する。
ここまで来て、ふと立ち止まる。
「で、永続化は何にする?」
DDD の本には書いてある ── “The Database is a Detail”(Robert Martin)、“the model is not the database”(Eric Evans)。永続化は最後に決められる詳細なのだ、と。
ところが現実はそう優しくない。Aggregate のサイズを決めようとした瞬間、トランザクション境界が DB の特性に依存することに気づく。UPDATE で 10 行を atomic に書きたい ── これが PostgreSQL なら自然、DynamoDB なら 25 件までの TransactWriteItems、複数リージョン跨ぎなら Spanner が要る。
つまり「永続化は詳細」と言いながら、詳細が設計を縛り返す。
逆のアプローチもある。AWS の Werner Vogels は “One size doesn’t fit all” と言い、DynamoDB の Rick Houlihan は “Start from access patterns” と言う。ワークロードを見て DB を決め、DB が schema を決め、schema が API を決める。ドメインは最後に滲み出てくる。
この二つの流派は、対立しているのか。それとも別レイヤーの話なのか。
このシリーズが目指すこと
本記事は「正規化」も「SQL アンチパターン」も扱わない。代わりに、DB を設計するときの “外さない軸” を、ドメイン駆動と特性駆動という二つの流派の対比を通して提示する。
具体的には:
- 第 1-3 章でドメイン駆動と特性駆動の地図を立てる
- 第 4-15 章で 6 つのワークロード(OLTP / OLAP / Cache / NoSQL / Stream / NewSQL)を、それぞれ「本質編」と「設計編」の 2 章で深掘りする
- 第 16 章で「ドメインから使われる側 = 共通基盤としての DB 設計」に踏み込む(Stripe の Idempotency、Multi-tenant 分離、Schema 進化)
- 第 17-18 章で Polyglot Persistence と、両派を行き来する設計判断のフレームを統合する
- 第 19 章で「外さない 9 つの軸」をチェックリストとして残す
対象読者
- Aggregate の設計はできるが、永続化選定で迷うエンジニア
- 共通基盤やプラットフォーム側の DB を設計する立場になり、ドメイン側との接続に違和感を持っている人
- 「DDIA は読んだが、自分の現場でどう使えばいいか分からない」人
- 複数の DB(RDB / NoSQL / Redis / NewSQL / Stream)を実務で触っているが、それらを統一した観点で見られていない人
「正規化とは何か」レベルから始める入門書ではない。
全 19 章の構成
読み方の選択肢
19 章は長い。読了の目安は 通読で 3-4 時間。読み方は 3 通り想定している:
A. 通読(推奨)
第 1 章 から順に読む。各章末の「次章への問いかけ」が次章を引っ張る構造で、1 章で投げた “両派は対立するのか” の問いが、4-15 章の各ワークロードで具体に降ろされ、16 章で共通基盤という両派が衝突する場所を扱い、17-18 章で行き来する作法に統合され、19 章でチェックリストに収束する。伏線回収を楽しむなら通読を。
B. 関心領域だけ読む
- DDD と DB の関係に違和感がある人:第 1-2 章 → 第 18 章
- 共通基盤の設計に不慣れな人:第 16 章 を直接読む(前提となる用語が少ない)
- 特定ワークロードの設計が知りたい人:本質編 + 設計編を 2 章セットで(例:OLTP なら 第 4 章 + 第 5 章)
C. リファレンスとして使う
第 19 章「外さない 9 つの軸」 のチェックリストから、その軸の根拠章へジャンプする。設計レビュー時の道具として。
読み方
各章末に次章への問いかけを仕込んでいる。流し読みでも筋は追えるが、章末の問いを意識して読むと伏線の張り方が見える。各章は単独でも読めるが、シリーズ全体は “両派の橋を架ける” ために設計されている。
それでは始めよう。第 1 章 は「二つの流派」の地図から。
目次
- ドメインから入るか、特性から入るか ─ 二つの流派 DB 設計には "ドメイン駆動" と "特性駆動" の 2 つの流派が実在することを示し、それぞれの主張と代表者を整理した上で、両派が同じレイヤーで対立しているのではないことを示唆する
- ドメイン視点の地図 ─ Aggregate / Bounded Context / Repository ドメイン駆動の主要概念(Aggregate / Bounded Context / Repository)を整理し、それらが永続化に対して何を要求するかを示し、"DB は詳細" の本当の意味と、現実に詳細が設計を縛り返す瞬間を描く
- ワークロード視点の地図 ─ 6 軸でデータを見る ワークロードを定義する 6 軸(read/write 比率・レイテンシ・整合性・データ形状・寿命・スケール)を整理し、各 DB が特定の組み合わせに最適化されている事実と、Pat Helland の "Inside vs Outside data" を導入して両派の橋渡しの第一歩を置く
- OLTP の本質 ─ MVCC・WAL・行指向 OLTP ワークロードの本質を Kleppmann の定義から振り返り、PostgreSQL の MVCC・WAL・行指向ストレージを通じて「読み書き並列を支える代償」と「Trans 境界の意味」を実装レベルで解説する
- OLTP 設計の意思決定 ─ Aggregate 境界・Hot row・Index・進化・非正規化 OLTP スキーマを設計するときに迷わずに進めるための 5 つの意思決定(Aggregate とトランザクション境界・Hot row 回避・インデックス戦略・スキーマ進化・非正規化の判断)を、PostgreSQL の特性と DDD の Aggregate 設計の合流地点で扱う
- OLAP の本質 ─ 列指向・Bulk read という別世界 OLAP ワークロードが OLTP と何が違うかを Kleppmann の定義から振り返り、列指向ストレージ・vectorized execution・compression の本質を ClickHouse / DuckDB を引きながら解説する
- OLAP 設計の意思決定 ─ Sort key・Dimensional Modeling・MV OLAP DB の設計で迷わずに進めるための 5 つの意思決定(Sort key / Partition / Dimensional Modeling / Materialized View / 進化戦略)を yuzutas0 のアジャイルデータモデリングと ClickHouse の実装をもとに整理する
- Cache の本質 ─ 揮発性・データ構造・Tier Cache 系 DB(Redis 中心)の本質を、antirez の「データ構造サーバー」哲学・単一スレッド・in-memory モデル・永続化(RDB/AOF)の選択から解説する
- Cache 設計の意思決定 ─ Cache-aside・TTL・Stampede・Key 設計 Cache 設計で迷わずに進めるための 5 つの意思決定(書き込み戦略・TTL の決め方・Stampede 対策・Key 設計・Cluster での hash tag)を Redis を主役に解説する
- KV / Document NoSQL の本質 ─ Partition と Eventual Consistency KV / Document NoSQL(DynamoDB 中心)の本質を、Partition と Eventual Consistency という 2 つの設計原則から解説し、Houlihan の "Single Table Design は deprecated" 発言(2024)を伏線として置く
- NoSQL 設計の意思決定 ─ アクセスパターン・Hot partition・GSI NoSQL(DynamoDB 中心)の設計で迷わずに進めるための 5 つの意思決定(アクセスパターン列挙・Partition Key 選定・Sort Key 設計・GSI / LSI 選択・Single vs Multi Table 判断)を Houlihan のテンプレートに沿って整理する
- Stream / Event Sourcing の本質 ─ append-only と時間 Stream / Event Sourcing の本質を Kafka を主役に、Kleppmann の "Turning the database inside out" と Pat Helland の Outside data の観点から解説する
- Stream 設計の意思決定 ─ イベント粒度・Partition・Schema 進化・Retention Stream / Event Sourcing 設計で迷わずに進めるための 5 つの意思決定(イベント粒度・Partition Key 設計・Schema 進化・Retention 戦略・Outbox Pattern)を Kafka と Adam Bellemare の event-driven アーキテクチャを引きながら整理する
- Geo-distributed / NewSQL の本質 ─ TrueTime・Raft・地理分散 NewSQL(Spanner / CockroachDB)の本質を、TrueTime(GPS+原子時計)と Raft+HLC という 2 つのアプローチの対比で解説し、CAP 定理の現代的な再解釈と外部整合性の意味を扱う
- NewSQL 設計の意思決定 ─ Region 配置・Locality・Consistency level NewSQL(CockroachDB / Spanner)の設計で迷わずに進めるための 5 つの意思決定(Region 配置・Locality 選択・Consistency level・Hot row 回避・Aggregate と地理の整合)を扱う
- ドメインから使われる側 ─ 共通基盤としての DB 設計 共通基盤として DB を設計する立場(ドメインから使われる側)の 7 つの判断 ─ Idempotency キー / Schema 進化 / Multi-tenant / Hot tenant / 監査 / クォータ / Repository が DAO に堕ちる宿命 ─ を Stripe / Sam Newman / Bellemare の知見から扱う
- Polyglot Persistence ─ 複数 DB を持つときのドメイン側の構え Martin Fowler の Polyglot Persistence を起点に、複数 DB を併用する実装上の判断(Source of truth・CDC・Saga・読み replica の整合性)を整理し、ドメイン側がどう構えるべきかを示す
- 両派を行き来する ─ Aggregate と Partition Key、Repository の壁 ドメイン駆動と特性駆動の二つの流派が衝突・合流する 5 つの場所(Aggregate と Partition Key、Trans 境界、Repository の限界、共通基盤の言語、Read Model の所有)を扱い、行き来するための設計判断のフレームを示す
- 外さない 9 つの軸 ─ ドメイン × 特性 × 共通基盤のチェックリスト 全 19 章のまとめとして、DB 設計で「外さない」ための 9 つの軸をチェックリスト形式で提示する。各軸はドメイン視点・特性視点・共通基盤視点の三層で点検できる構造