Progetta prima per il pattern di accesso, poi scegli il partitioning + l'index/PK giusto così che ogni singola query tocchi una fetta piccola e limitata — mai uno scan di 10B di righe. Sotto i 100ms su 10 miliardi di record non si tratta di un disco più veloce; si tratta di rendere minuscolo il working set.
Query ─▶ Router ──▶ Partition (by tenant/time) ──▶ Index/PK lookup ─▶ ~thousands of rows
│ (prune 99.9% of data) (B-tree / sort key)
└─▶ Cache (Redis) ─▶ hit? return in <5ms
miss ▼
Columnar store (ClickHouse) for aggregates / scans
I pattern di accesso guidano tutto
Prima di scegliere la tecnologia, chiediti: "Prendi gli ultimi 20 ordini dell'utente X" è una query point/range — vuoi che partition key e sort key la assecondino esattamente. "Somma il fatturato per regione questo mese" è uno scan analitico — un row store è lo strumento sbagliato. Modellare prima la query è ciò che separa un design che funziona da uno che sembra ragionevole ma fa full-scan.
