Я разрабатываю систему, которая должна хранить события. Каждое событие имеет три основных свойства:
1. метка времени (64 бита)
2. ключ (что это).
3. значение (фактическое значение для события).
Ключи событий обычно являются строками, значения событий - почти всегда числами.
Пока все просто, но здесь становится немного грязно. Система событий должна допускать детализацию до очень высокого уровня. Что это означает, лучше всего проиллюстрировать на примере:
NB. Для краткости оставим отметку времени.
key: hits // might be per hour, might be in the last second, the key is application specific, its up to the user to figure out how often his application reports this event to us.
value: 12000
// and here the drilldown starts.
key: US
value: 5000
key: State1
value: 2000
key: City1
value: 500
key: UK
value: 5000
key: StateN
value: 20
// to an arbitrary level.
Итак, как вы можете видеть выше, значение фактически превращается в дерево.
Можно было бы сказать, ну почему бы не хранить каждый к / в независимо и поддерживать «родительский ключ», это было бы неэффективно из-за увеличения записи (и, в конечном итоге, при поиске событий, чтение при загрузке). было бы гораздо эффективнее выписать их за одну операцию и прочитать весь объект за один раз.
Мне интересно, как лучше спроектировать это. Объекты - это, по сути, класс C ++ (хотя для обеспечения совместимости это на самом деле инфраструктура сериализации, а именно, буферные / управляющие протоколы).
Система событий не зависит от приложения, но я хочу, чтобы хороший API предоставил клиентам интуитивно понятный интерфейс.
Вы проектировали что-то подобное раньше? Мысли? Как вы думаете, как лучше всего это сделать?
Заранее спасибо.
P.S .: Ожидается несколько миллионов событий в день, и мы будем строить графики на основе данных.