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

CRUD から CQRS へ ~ 分離が可能にする柔軟性

CRUD から CQRS へ ~ 分離が可能にする柔軟性

イベントソーシング・CQRS 勉強会 #2
https://sekiban.connpass.com/event/350481/

株式会社ジェイテックジャパン
Developer Advocate for Sekiban 川江貴志

CRUD が抱える課題と、その解決策としての CQRS に焦点を当てます。読み取りと書き込みの特性が根本的に異なることから生じる問題点を解説し、これらを分離することで得られる柔軟性とスケーラビリティのメリットをご紹介します。

Avatar for Takashi Kawae

Takashi Kawae

May 19, 2025
Tweet

More Decks by Takashi Kawae

Other Decks in Programming

Transcript

  1. セッション内容 1. CRUD の課題 2. CQRS という解決策 3. CQRS とイベントソーシングは不可分

    CQRS とイベントソーシングに関する、割と基礎的な概念の話です
  2. Client 書き込み操作 読み取り操作 Create Update Delete Read DB CRUD とは

    Create / Read / Update / Delete の頭文字 データベースやアプリケーションでデータ を操作する際に必要な基本的な4つの機能 実装がシンプルで理解しやすいデータ操作 の概念 通常、読み取り (Read) と書き込み (Create/Update/Delete) に同じデータモ デル (エンティティやテーブル構造) を使う → 読み取りと書き込みは同じ?
  3. データの読み取りと書き込みの特性は違う 観点 読み取り (クエリ) 書き込み (コマンド) 目的と責任 データの検索・取得 データの状態の変更 期待されるデータモ

    デル 表示のための非正規化モ デル データの整合性を維持する正規 化モデル 最適化の方向性 データ取得の高速性が重 要 ビジネスロジックの正確な実行 が重要 スケーリング スケールアウトで対応し やすい スケールアップで対応しやすい アプリケーションが複雑になればなるほど相違が明確になる 本質的に異なるものを一つにまとめるのは簡単ではない
  4. Client コマンド処理 Command Model Write DB クエリ処理 Query Model Read

    DB CQRS とは 日本語ではコマンドクエリ責務分離 コマンド (更新操作) とクエリ (読み取り操作) を 明確に分離し、異なるモデルとして実装する設 計手法 読み取りと書き込みで異なるデータストアの使 用も可能 読み取りと書き込みは本質的に違うので、 別々に設計・実装しよう、という考え方
  5. CQRS のデメリット 複雑性の増加 2つのモデル管理: 読み書きモデルを別々に設計・維持する必要がある 同期メカニズム: コマンド処理の結果をクエリモデルに反映させる仕組みが必要 結果整合性への対応 即時一貫性の欠如: 読み取りモデルの更新に遅延が生じる可能性がある

    ユーザー体験の考慮: 更新後すぐに反映されない状況を適切に処理する必要がある 導入の難しさ 学習コスト: 従来の CRUD ベースの開発に比べて概念理解のハードルが高い オーバーエンジニアリングの危険: 小規模なアプリケーションでは不必要に複雑に なる可能性がある
  6. Client Command Model Command Handler Event Event Store Query Model

    Projection Projector Materialized View CQRS とイベントソーシングは一体 自然な相互補完: イベントソーシングはコマン ド処理の結果をイベントとして記録し、クエリ モデルの更新ソースとなる 状態管理の整合性: コマンドから生成されたイ ベントが、読み取りモデルの唯一の情報源とな り一貫性を確保 独立した発展: クエリモデルはイベントストリ ームから自律的に構築され、コマンドモデルと の分離が促進される 履歴トレーサビリティ: イベントの連続として システム全体の状態変化を追跡・再現可能