プログラマー俺、CQRSを完全に理解する
■ このスレッドは過去ログ倉庫に格納されています
まずCQRSはデータベース設計パターンの一つ CQRSは参照系操作と更新系操作を分けることで色々といい感じになるやつだ 高度なSQLの時代は終わった
これからはCQRSの時代 参照系と更新系を分けると言われてもピンとこないと思う
まず例をあげようユーザテーブルを設計する場合は何も正規化をしない場合次のようになるかと思う
user
id
name
registered_at
withdrew_at
reinstatement_at
updated_at
それぞれのイベントがある度にoo_atが更新される
ユーザが登録すればregistered_atがnullから日付に更新される
しかしこれにはちょっとした欠点がある
ユーザ情報を更新している最中は参照系クエリがブロックされること。 サービスが大規模になるとこれがパフォーマンス的も良くない感じになる。
そしてもう一つの欠点として退会と復会を繰り返したりユーザ名を変更すると履歴がおえなくなってしまう。
ユーザ名を変更したと思ったらアカウントが消えてしまいました!なんていうユーザからのお問い合わせに対処できない! >>4
ごめん
CQRSは結構複雑性上がるので全てにたいしてCQRSを適用すべきではないと個人的には思う
CRUDがいい場合もある ここにきてCQRSを語る上でかかせない概念であるイベントソーシングを説明しよう
イベントソーシングはステートソーシングと対になる概念だ!
ステートソーシングはデータを状態として持つことで表現するが、イベントソーシングはイベントを使ってデータを表現する
銀行残高を例に考えてみよう
銀行残高が変動するイベントとしては、入金、送金、出金などが槓が得られる
ステートソーシングの場合はそれらのイベントが起こるたびに一つのレコードを更新する
イベントソーシングの場合はイベントそれぞれを別のモデルに挿入する
現在の残高はイベントモデルを集約するだけでいい
これによってデータを履歴として残すことが可能になり、ユーザーからのお問い合わせにきっちり答えることができるようになるんだ ipaのデスペ、oss-db silver/gold持ってるitエンジニア歴23年のものだけど
んー、やり直し アイソレーションによるからブロックされると決めつけるのはちょっと イベントとして記録することで様々なイベントが起きても絶対に行がロックされない素晴らしいシステムができた訳だが、これだけだとパフォーマンスはゴミになる
何故なら残高を見るためには複数のレコードを毎回Joinして走査する必要が出てくるためだ!
そこで集約したでーたを記録しておくためのモデルを作ってしまうんだ
イベントが来たら挿入した上で参照用のモデルを更新する
これによって参照時のクエリコストは非常に小さくなる イベントソーシングにより更新系はイベント用モデル、参照系は参照用モデルに分ける事ができた 結局それだと参照モデルの更新時にブロック発生せん?
確かに履歴を追えるようになったのはいいけど >>15
たしかに
そもそもロック云々は関係ない説が出てきた ■ このスレッドは過去ログ倉庫に格納されています