第02章:イベントソーシングって何?(超入門)🌸🧠
この章でできるようになること🎯✨
- 「イベントソーシング」を一言で説明できるようになる😊
- 「状態を保存する」やり方との違いがわかる🔍
- 「イベント(出来事)」をちょうどいい粒度でイメージできるようになる🎛️
- 「イベントの列から、今の状態を作り直せる」感覚がつかめる🔁✨
まず一言でいうと…🗣️💡
イベントソーシング(Event Sourcing)とは、アプリの状態の変化を「出来事(イベント)」として全部記録して、状態は必要なら後から作り直す、という考え方だよ📚✨ 定義としては、状態の変更をイベントとして記録し、そのイベント列を保存するのがコアになるよ。(martinfowler.com)
「状態を保存」vs「出来事を保存」💾⚖️
ふつうの保存(状態保存)📌
- DBに「今の状態」を保存する 例:残高 = 10,000円 💰
イベントソーシング(出来事保存)📜
- 「状態がどう変わったか」を時系列で保存する 例:入金した +5,000円 ➕ / 出金した -2,000円 ➖ …
イメージ図でつかもう🎨✨

(状態保存)
[残高テーブル]
残高 = 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 入出金(イベント)を比べる💰📝
お題🎒
ある人の口座で、次が起きたよ👇
- 入金 +10,000円
- 出金 -3,000円
- 出金 -2,000円
(1) 状態保存で表すなら?📌
- 最終的な残高は?(計算してみてね)🧮✨
- そのDBには何が入る?
(2) イベントソーシングで表すなら?📜
-
イベントを3つ、過去形で書いてみよう✍️
- 例:
Deposited/Withdrawnみたいな感じ
- 例:
(3) “嬉しさ”を一言で書く🌸
- 「状態保存だけ」だと困ることを1つ
- 「イベントがある」から助かることを1つ
AI活用(プロンプト雛形)🤖✨(コピペOK)
やさしい言い換えを作ってもらう🧸
イベントソーシングを、女子大学生にも分かるように、
「家計簿」か「推し活のポイント管理」の例で、
100文字以内で説明して。専門用語はできるだけ避けて。
イベント案を出してもらう📮✨
題材を「ネット通販のカート」にして、
Command と Event を混ぜないように、
Event(過去形)候補を10個出して。
粒度が大きすぎる/小さすぎる例もそれぞれ1つ出して。
“状態保存だと困る未来要件”を出してもらう🔮
状態保存(今の状態だけDBに保存)で作った場合に、
あとから追加されて困りそうな要求を10個出して。
監査・履歴・巻き戻し・分析なども混ぜて。
よくある勘違い3つ🙅♀️🌀
-
「イベント = ログ」? 似てるけど、イベントは「ビジネス上の出来事」として意味があるよ📜✨(あとで状態を作れるのが大きい)
-
「状態を持たない」? 持つよ😊 ただし「真実(source of truth)はイベント列」で、状態はそこから作れる、って感覚🔁(martinfowler.com)
-
「いきなり難しい分散システムが必要」? 最初は全然いらないよ🙌 このコースも、まずは最小構成で“仕組みを体感”していくよ🧪✨
今どきの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)
セルフチェック✅🌸
- 「状態保存」と「イベント保存」の違いを、例つきで言える?🗣️
- 「イベント列があれば状態を作れる」って、図で説明できる?🎨
- 「履歴が欲しい」「過去に戻したい」が、なぜ強くなるか分かる?🕰️🔁