【しーきゅーあーるえす】

CQRS とは?

最終更新:
💡 「書くためのモデル」と「読むためのモデル」を分ける

データを変更するコマンドと、取得するクエリの責務を別々のモデルに分ける設計パターン。データベースも分ける構成はあるが、分離が必須なのは読み書きのモデルである。

📌 このページのポイント
読み書きのモデルを分ける書き込みモデル例:予約する条件を確かめて変更読み取りモデル例:予約一覧を読む表示用の情報を取得同じDBDBの物理的な分離は必須ではない
同じDBを共有するCQRSの例。別DBを使う構成では、更新の反映方法や遅延も設計する。
ひよこ ひよこ
なぜ読み書きのモデルを分けるの?
ペンギン先生 ペンギン先生
書き込みでは注文の条件や整合性を確かめ、読み取りでは一覧画面に必要な形でデータを返したい、という違いがあるからだよ。別々のモデルなら、それぞれの目的に合わせて設計できるんだ。
ひよこ ひよこ
DBも必ず2つに分けるの?
ペンギン先生 ペンギン先生
同じDBを共有しても、読み書きのモデルを分ければCQRSにできるよ。別々のDBを使う場合は、表示向けのデータ構造や、それぞれの負荷に合わせた構成を選べる。一方で更新を反映する仕組みも必要になるね。
ひよこ ひよこ
書いた直後に、読んだ結果へ反映されるの?
ペンギン先生 ペンギン先生
同じDBを共有するか、別DBへどう反映するかなど、構成によるよ。イベントを使って別の読み取りDBを非同期で更新する場合は、反映に遅れが出ることがある。画面が古い情報を示す場合も考えて設計しよう。
ひよこ ひよこ
イベントソーシングも必要なの?
ペンギン先生 ペンギン先生
必須ではないよ。イベントソーシングは状態の変更をイベントの履歴として保存する方式。CQRSと組み合わせて、その履歴から表示向けの読み取りモデルを作る構成もあるんだ。
ひよこ ひよこ
どんなシステムにも使うといいの?
ペンギン先生 ペンギン先生
読み書きの処理や負荷が大きく違う場合には役立つけれど、同期や運用が複雑になることもある。単純なCRUDで十分な場合もあるから、分離する利点と負担を比べて選ぼう。
ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「CQRS」って出てきたら「読み取りと書き込みのモデルを分ける設計」と思えばだいたいOK!
📖 おまけ:英語の意味
「Command Query Responsibility Segregation」 = コマンドクエリ責務分離
💬 Command(命令=書き込み)とQuery(問い合わせ=読み取り)のResponsibility(責務)をSegregate(分離)するよ

参考資料

← 用語集にもどる