副作用のある操作(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用のテーブルを作る必要はありますが、データの重複が最低限で済みます。