Raw event tables are great for flexibility and terrible for dashboard consistency under peak load.
Pattern
- Ingest immutable raw facts.
- Build deterministic rollup MVs.
- Query rollups by default; raw only for deep-dive.
CREATE MATERIALIZED VIEW mv_daily_signups
ENGINE = SummingMergeTree
ORDER BY (org_id, day)
AS SELECT org_id, toDate(ts) AS day, count() AS signups
FROM events
WHERE event_name = 'signup'
GROUP BY org_id, day;Analytics stability comes from precomputation discipline.