台帳をアカウントと時間でパーティション分割し、最近のデータをホットに古いデータをコールドに保ち、行を追記専用の不変な台帳として扱います。こうすれば単一アカウントの履歴は小さくインデックスされたスライスになり、決して数十億行のスキャンにはなりません。 アクセスパターンは常に「1アカウント、日付範囲」なので、それに合わせてパーティション分割します。
アーキテクチャ
text
Write ─▶ Ledger table (append-only, immutable)
partition by (account_hash, month)
│
┌────────┴─────────┐
HOT tier COLD tier
last 3 mo older
Postgres/SSD S3/Parquet, Glacier
│ │
index-seek keyset paginate ──▶ API (account+range)
