We're in the process of building a vNext Data/Reporting Platform for capturing Web & Sales Traffic.
At a very high level we're capturing Impressions, Clicks & Sales Data which then needs to be reported on.
- Impressions are on the order of Millions per day
- Clicks: 100,000's per day
- Sales: 1000's per day
My first pass design for the platform essentially aggregates data into Hourly, Daily, Weekly & Monthly structures. Each being grouped on a number of other dimensions (Client, Brand, Product, Country, Retailer etc...) with Impression Counts, Click Counts, Total Value etc...
So each hour, source data gets aggregated -> Hourly
And then each day:
- the prev 24h of
Hourly
Data -> NewDaily
- the prev 24h of
Hourly
Data -> Added to existingWeekly
or create newWeekly
- the prev 24h of
Hourly
Data -> Added to existingMonthly
or create newMonthly
This gives us a lot of flexibility for reporting efficiently as well as monitoring trends and identifying potential problems.
One thing I'm not sure on is how to "Fix" data in the event a "discrepancy" gets into our aggregated data.
e.g. Every once in a while a customer will provide incorrect pricing information. When that occurs, the "Potential Value" on each click and impression will be wrong.
So that source data ends up in the Hourly aggregates.
If unnoticed, for even one day, that hourly data pollutes the daily, weekly & monthly aggregates. And because those aggregates are being built and added to cumulatively, you can't easily undo it. (You can't pour the blue water out of the jug of purple water).
The naive solution here would seem to be to throw away the subset of aggregated data that's been polluted, fix the source data, and then regenerate each of those aggregates that's been removed. Which one day later might mean throwing away 24 Hourly's, 1 Daily, 1 Weekly & 1 Monthly.
Or is there another approach here that I'm not thinking of?