CQRSとは

副作用のある操作(command)と副作用の無い操作(query)は分離しよう、という設計思想のことです。

SQLで言えば、insert、update、deleteが副作用のある操作、selectが副作用の無い操作です。

イミュータブルデータモデルでは副作用のある操作はinsertしか使わないため、複数のテーブルに分割する必要がありました。

insertする時は問題にはなりませんが、複雑な検索条件(何かの一覧を検索してソートする、等)の場合、SQLの発行回数がかなり多くなってしまいます。

このように複雑な検索をしようとしている場合は、query用に専用のテーブルを用意したほうがパフォーマンスも良くなり、コードもシンプルになります。

classDiagram

class query{
	UUID id
	text value1
	text value2
	text value3
	text value4
	text value5
	text value6
	text value7
	text value8
	timestamp created_at
}

実は、同じ仕組みでcommand用のテーブルを作ることもできます。

classDiagram
class id{
	UUID id PK
	timestamp created_at
}

class command{
	UUID id FK
	text value1
	text value2
	text value3
	text value4
	text value5
	text value6
	text value7
	text value8
	timestamp created_at
}

id <|-- command

この仕組みでも、updateとdeleteは使っていないためイミュータブルデータモデルと呼べます。

ただし、データの重複が酷くなってしまうため、前述したとおり別のテーブルとして分割したほうが良いでしょう。

しかし、データの重複を許容できるのであれば十分選択肢に入ります。

この仕組みのことを全分insertと呼びます。

一方で、別のテーブルとして分割した場合の仕組みのことを差分insertと呼びます。

全分insertを採用した場合は、query用のテーブルを作る必要は無くなりますが、代わりにデータの重複が相当発生します。

差分insertを採用した場合は、query用のテーブルを作る必要はありますが、データの重複が最低限で済みます。