Ontwerp eerst voor het toegangspatroon, kies dan partitionering + de juiste index/PK zodat elke afzonderlijke query slechts een kleine, begrensde slice raakt — nooit 10 miljard rows scant. Sub-100ms over 10 miljard records gaat niet over een snellere schijf; het gaat over de working set klein maken.
Query ─▶ Router ──▶ Partitie (op tenant/tijd) ──▶ Index/PK-lookup ─▶ ~duizenden rows
│ (snoei 99,9% van de data) (B-tree / sort key)
└─▶ Cache (Redis) ─▶ hit? geef terug in <5ms
miss ▼
Columnar store (ClickHouse) voor aggregaties / scans
Toegangspatronen bepalen alles
Vraag vóór je tech kiest: "Haal de laatste 20 orders van gebruiker X" is een point/range-query — je wilt dat de partition en sort key er precies bij passen. "Sommeer omzet per regio deze maand" is een analytische scan — een row store is het verkeerde gereedschap. De query eerst modelleren onderscheidt een ontwerp dat werkt van een dat redelijk lijkt maar full-scant.
