メインコンテンツまでスキップ

第02章:イベントソーシングって何?(超入門)🌸🧠

この章でできるようになること🎯✨

  • 「イベントソーシング」を一言で説明できるようになる😊
  • 「状態を保存する」やり方との違いがわかる🔍
  • 「イベント(出来事)」をちょうどいい粒度でイメージできるようになる🎛️
  • 「イベントの列から、今の状態を作り直せる」感覚がつかめる🔁✨

まず一言でいうと…🗣️💡

イベントソーシング(Event Sourcing)とは、アプリの状態の変化を「出来事(イベント)」として全部記録して、状態は必要なら後から作り直す、という考え方だよ📚✨ 定義としては、状態の変更をイベントとして記録し、そのイベント列を保存するのがコアになるよ。(martinfowler.com)


「状態を保存」vs「出来事を保存」💾⚖️

ふつうの保存(状態保存)📌

  • DBに「今の状態」を保存する 例:残高 = 10,000円 💰

イベントソーシング(出来事保存)📜

  • 「状態がどう変わったか」を時系列で保存する 例:入金した +5,000円 ➕ / 出金した -2,000円 ➖ …

イメージ図でつかもう🎨✨

3ステップ学習法

(状態保存)
[残高テーブル]
残高 = 10,000円
↑ 今どうなってるかは分かる
↓ でも「どうしてそうなった?」が弱い

(イベントソーシング)
[イベントの列]
1) 入金した +5,000円
2) 出金した -2,000円
3) 入金した +7,000円
↑ 「何が起きたか」が全部ある
↓ だから、必要なら今の残高も作れる(足し算するだけ)

なんで「出来事」を積むと嬉しいの?😊🌟

1) 履歴が最初からちゃんと残る📜✨

「いつ・誰が・何をした」が自然に残るよ。監査ログ(監査証跡)っぽいのが標準装備になる感じ🕵️‍♀️✅

2) “タイムトラベル”できる🕰️🔁

「昨日の時点の状態」を作り直せるよ。 たとえば「この不具合、いつから起きた?」が追いやすい🔎✨

3) 読みやすい画面用データを後から作れる🧾✨

イベントを流して、「一覧表示に特化した形(Projection)」を作れる。 「検索が遅い…」みたいな悩みに対して、逃げ道が増えるよ🚪😊

4) 将来の変更に強くなることがある🧱✨

状態だけ保存してると「後から履歴が欲しい!」が来たとき地獄になりがち😵‍💫 イベントがあれば「履歴は最初からある」になりやすい👌


でも、いいことだけじゃない🙅‍♀️⚠️(超やさしく)

イベントソーシングは強いけど、次のコストがあるよ💸💦

  • イベント設計(名前・粒度・中身)が大事になる(雑だとつらい)😵
  • **イベントは基本“消さない・変えない”**文化になる(後で工夫が必要)🧬
  • 「今の状態」はイベント列から作るから、**再構築(復元)**を考える必要がある🔁

このコースは、そのへんを「最小の形」から順にやっていくから安心してOKだよ🌸😊


超ミニ例:家計簿で比べてみる🧺💰

状態保存だけだと…

  • 「今月の残高」しかない

    • 残高 = 12,340円 → 「どうしてそうなった?」が後から追いにくい😢

イベントを積むと…

  • 1/10 給料が入った +200,000円 💴
  • 1/11 家賃を払った -80,000円 🏠
  • 1/12 カフェ -650円 ☕ → 「流れ」がそのまま残る✨

C#で「イベント列から状態を作る」感覚だけ体験しよう🧪✨

ポイントはこれだけ👇

  • イベント(出来事)を並べる
  • 順番に適用(Apply)して状態を作る
// ✅ 1) イベント(出来事)を型として表す(超ミニ)
public interface IEvent;

public record Deposited(int Amount) : IEvent; // 入金した
public record Withdrawn(int Amount) : IEvent; // 出金した

// ✅ 2) “今の状態”を表す
public record AccountState(int Balance)
{
public static AccountState Empty => new(0);

// ✅ 3) イベントを適用して状態を更新する(Apply)
public AccountState Apply(IEvent e) => e switch
{
Deposited x => this with { Balance = Balance + x.Amount },
Withdrawn x => this with { Balance = Balance - x.Amount },
_ => this
};
}

// ✅ 4) イベント列から状態を作り直す(Rehydrate)
public static class AccountRehydrator
{
public static AccountState Rehydrate(IEnumerable<IEvent> events)
{
var state = AccountState.Empty;
foreach (var e in events)
state = state.Apply(e);
return state;
}
}

ここでの理解ポイント💡😊

  • 「DBに残高を保存しなくても、イベントがあれば残高を作れる」🔁
  • しかも「どうしてその残高?」もイベント列で説明できる📜✨

ミニ演習:残高(状態)vs 入出金(イベント)を比べる💰📝

お題🎒

ある人の口座で、次が起きたよ👇

  1. 入金 +10,000円
  2. 出金 -3,000円
  3. 出金 -2,000円

(1) 状態保存で表すなら?📌

  • 最終的な残高は?(計算してみてね)🧮✨
  • そのDBには何が入る?

(2) イベントソーシングで表すなら?📜

  • イベントを3つ、過去形で書いてみよう✍️

    • 例:Deposited / Withdrawn みたいな感じ

(3) “嬉しさ”を一言で書く🌸

  • 「状態保存だけ」だと困ることを1つ
  • 「イベントがある」から助かることを1つ

AI活用(プロンプト雛形)🤖✨(コピペOK)

やさしい言い換えを作ってもらう🧸

イベントソーシングを、女子大学生にも分かるように、
「家計簿」か「推し活のポイント管理」の例で、
100文字以内で説明して。専門用語はできるだけ避けて。

イベント案を出してもらう📮✨

題材を「ネット通販のカート」にして、
Command と Event を混ぜないように、
Event(過去形)候補を10個出して。
粒度が大きすぎる/小さすぎる例もそれぞれ1つ出して。

“状態保存だと困る未来要件”を出してもらう🔮

状態保存(今の状態だけDBに保存)で作った場合に、
あとから追加されて困りそうな要求を10個出して。
監査・履歴・巻き戻し・分析なども混ぜて。

よくある勘違い3つ🙅‍♀️🌀

  1. 「イベント = ログ」?  似てるけど、イベントは「ビジネス上の出来事」として意味があるよ📜✨(あとで状態を作れるのが大きい)

  2. 「状態を持たない」?  持つよ😊  ただし「真実(source of truth)はイベント列」で、状態はそこから作れる、って感覚🔁(martinfowler.com)

  3. 「いきなり難しい分散システムが必要」?  最初は全然いらないよ🙌  このコースも、まずは最小構成で“仕組みを体感”していくよ🧪✨


今どきのC#/.NETまわり(最新の前提)🆕✨

  • .NET 10 は「最新の .NET の大きなリリース(LTS)」として案内されているよ📦✨(サポート期間も明記されてる)(Microsoft for Developers)
  • C# 14 は .NET 10 でサポートされていて、最新の言語機能としてまとめられてるよ🧠✨(Microsoft Learn)
  • .NET 10 の「最新リリース(例:10.0.2)」みたいに、パッチ版も継続的に更新されるよ🔧🗓️(Microsoft)
  • Visual Studio 2026 のリリースノートも公開されていて、.NET 10 対応などが記載されてるよ🛠️✨(Microsoft Learn)

セルフチェック✅🌸

  • 「状態保存」と「イベント保存」の違いを、例つきで言える?🗣️
  • 「イベント列があれば状態を作れる」って、図で説明できる?🎨
  • 「履歴が欲しい」「過去に戻したい」が、なぜ強くなるか分かる?🕰️🔁