集約
ドメイン駆動設計において、一貫性を保つべきオブジェクト群をまとめ、単一のルートエンティティ経由でアクセスする設計パターン
集約とは
集約 (Aggregate) は、ドメイン駆動設計 (DDD) における戦術的パターンの 1 つで、トランザクション整合性を保つべきオブジェクト群を 1 つの単位としてまとめる設計手法である。集約の外部からは、集約ルート (Aggregate Root) と呼ばれるエンティティを通じてのみアクセスが許可される。
典型例として、EC サイトの「注文」を考える。注文 (Order) が集約ルートであり、注文明細 (OrderItem)、配送先住所 (ShippingAddress) が内部のオブジェクトとなる。外部のコードが OrderItem を直接変更することは許されず、必ず Order のメソッドを経由する。この制約により、「注文合計金額と明細の合計が一致する」といったビジネスルール (不変条件) を集約ルートが一元的に保証できる。
なぜ集約が必要なのか
リレーショナルデータベースでは、外部キーとトランザクションで整合性を担保できる。しかし分散システムやマイクロサービスでは、複数のテーブルやサービスにまたがるトランザクションはコストが高く、スケーラビリティの障壁になりうる。集約は「1 トランザクションで更新する範囲」を明確に定義することで、この問題に対処する。
集約の設計ルール
Vaughn Vernon が「実践ドメイン駆動設計」で示した設計ルールは次のとおり。
- 集約の境界はトランザクションの境界と一致させる。1 つのトランザクションで更新するのは 1 つの集約のみ
- 集約間の参照は ID で行う。オブジェクト参照ではなく、相手の集約ルートの ID を保持する
- 集約をできるだけ小さく保つ。不変条件の維持に必要な最小限のオブジェクトだけを含める
- 複数の集約にまたがる整合性は、ドメインイベントによる結果整合性 (Eventual Consistency) で担保する
実務での使われ方
DynamoDB では、例えば PK=ORDER#123 の下に 1 つの注文の集約 (注文ヘッダーと明細) を格納し、TransactWriteItems でまとめてアトミックに更新できる。
RDB を使う場合でも、集約の境界を意識することで「どのテーブルを 1 つのトランザクションに含めるか」が明確になる。ORM のリポジトリパターンと組み合わせ、集約単位で永続化する形もある。
よくある誤解と落とし穴
失敗の 1 つは、集約を大きくしすぎることだ。「注文」に「顧客情報」「在庫情報」まで含めると、ロック競合が増え、性能が落ちうる。逆に小さくしすぎると、本来 1 トランザクションで保証すべき不変条件が集約をまたいでしまい、結果整合性の複雑なハンドリングが必要になる。
もう 1 つの誤解は「集約 = テーブル」という対応づけだ。集約はドメインモデルの概念であり、永続化の構造とは独立している。1 つの集約が複数テーブルに保存されることも、1 つのテーブルに複数の集約が格納されることもある。
「実践ドメイン駆動設計」(Vaughn Vernon 著) で集約の設計ルールが体系的に解説されている。Eric Evans の「ドメイン駆動設計」が概念の原典であり、Vernon の著作がその実装面を補完する関係にある。
class Order {
private items: OrderItem[] = [];
addItem(product: string, qty: number) {
this.items.push(new OrderItem(product, qty));
}
get total() { return this.items.reduce((s, i) => s + i.subtotal, 0); }
}
// Order が集約ルート、OrderItem は内部エンティティ
体系的に学ぶなら関連書籍を参照してほしい。
この記事は役に立ちましたか?
関連用語
ドメイン駆動設計 (DDD)
ビジネスドメインの知識を中心に据え、ドメインエキスパートと開発者が共通言語で協働しながらソフトウェアを設計する手法
境界づけられたコンテキスト
ドメインモデルが一貫した意味を持つ範囲を明確に区切り、モデルの曖昧さを排除する DDD の戦略的パターン
イベントソーシング
状態の変更をイベントとして記録し、イベントの再生で現在の状態を復元する設計パターン
ACID
データベーストランザクションの 4 つの特性 - 原子性、一貫性、分離性、永続性
トランザクショナルアウトボックス
データベースへの書き込みとイベント発行を原子的に行うための分散システムパターン
トランザクション分離レベル
同時実行されるトランザクション間のデータの見え方を制御するデータベースの設定
関連する記事
技術書ランキングの決定版はどれか - IT エンジニア本大賞の歴代大賞と言及数データで読む
技術書ランキングを探している人向けに、検証可能な 2 つのデータ (IT エンジニア本大賞の歴代大賞 2014-2026 年と、当サイトの Qiita / Zenn 言及数ランキング) を整理。歴代受賞作の一覧表と、ランキングを選書に活かす方法を解説します。
技術書を読む順番の戦略 - 複数冊を組み合わせて理解を加速させる
技術書を 1 冊ずつ読むのではなく、複数冊を戦略的に組み合わせることで、1 冊では届かない理解の深さと広さに達する方法を解説します。
README を書くように本を読む - エンジニアのための構造化読書法
エンジニアが日常的に書く README のフォーマットを読書に応用する方法を紹介します。目的 / 使い方 / 注意点の 3 点で本の内容を整理すると、半年後に読み返しても実務で引き直せる記録として残ります。