Logo update cost across three designs
One logo, 100K products: read cost vs write fan-out
teaching numbers: 800 reads/s, 1.5 ms lookup, 2K/s backfill
Reference
reads: +1 lookup each
tax: 1.2 core-s/s
change: 1 atomic row
stale window: none
freshness: immediate
fallback: the table itself
pick when instant matters
Embedding
reads: zero extra
change: 100K writes
mixed window: ~50 s
no resume cursor
freshness: worst
death mid-batch: mix stays
almost never pick this
Derived view
reads: zero + version tag
change: 100K async
guard: logo_v check
resume from cursor
lag budget: 5 s, alerted
covers 10K per sweep
pick when 5 s is fine
authority: brands(logo_url, logo_v) - retry only the unwritten cursor range
duplicate outbox events die on the version guard - lag past budget falls back
decision: the acceptable lag number picks the method - a copy is a debt with an update path