источников:
                  
                  
                  1. список источников открыт (т.е. в процессе сбора данных иногда могут появляться новые источники), но не будет бурного роста их числа. Скажем, количество источников - единицы десятков тысяч. Количество событий: миллионы, сотни миллионов.
                  
                  
                  2. источник в событии идентифицируется строкой (обычно это 50...300 символов)
                  
                  
                  
                  
                  
                  запросы к системе будут:
                  
                  
                  1. Как по общему набору событий (какие-то агрегации)
                  
                  
                  2. Так и выборки по конкретным источникам
                  
                  
                  
                  
                  
                  вопросы:
                  
                  
                  1. По привычке хочется пронумеровать источники и нормализовать схему. Надо ли это делать в clickhouse?
                  
                  
                  2. Если нормализовать надо (выгодно), то как это сделать на лету?
                  
                  
                  
                  
                  
                  что-то такое сходу набросал (https://www.db-fiddle.com/f/f6k6T5rJnN3yt3php9QrN6/0):
                  
                  
                  
                  
                  
                  -- сюда будут писаться миллионы (миллиарды?) записей
                  
                  
                  create table myDb.event_buffer
                  
                  
                  (
                  
                  
                      event_prop1     String,
                  
                  
                      -- ...
                  
                  
                      event_propN     String,
                  
                  
                      event_source    String -- строка обычно на 50...300 символов
                  
                  
                  ) engine = Kafka       -- например, читаем из kafka
                  
                  
                  ;
                  
                  
                  
                  
                  
                  create table myDb.event
                  
                  
                  (
                  
                  
                      event_source_id UInt64
                  
                  
                      event_prop1     String,
                  
                  
                      -- ...
                  
                  
                      event_propN     String,
                  
                  
                  ) engine MergeTree();
                  
                  
                  
                  
                  
                  -- уникальных значений name ожидатся в районе нескольких десятков тысяч
                  
                  
                  create table myDb.event_source
                  
                  
                  (
                  
                  
                      id      UInt64,
                  
                  
                      name    String
                  
                  
                  ) engine -- КАКОЙ ВЫБРАТЬ?
                  
                  
                  
                  
                  
                  create materialized view myDb.event_extractor to myDb.event as
                  
                  
                      select
                  
                  
                       sipHash64(event_source) as event_source_id,
                  
                  
                       event_prop1, /* ... */, event_propN
                  
                  
                      from myDb.event_buffer;
                  
                  
                  
                  
                  
                  create materialized view myDb.event_souce_extractor to myDb.event_source as
                  
                  
                      select
                  
                  
                       sipHash64(event_source) as id,
                  
                  
                       event_source as name
                  
                  
                      from myDb.event_buffer;
                  
                  
                  
                  
                  
                  
                  
                  
                  это похоже на рабочую схему? В ней для myDb.event_source какой движок выбрать, чтобы обеспечить уникальность строк таблицы?
                  
                  
                
> myDb.event_source ... engine -- КАКОЙ ВЫБРАТЬ? если кластер, то вариантов немного - ReplicatedReplacingMT. Если singleserver, то я бы попробовал Join(Any,Left,id) settings join_any_take_last_row=1 Но даже если и кластер, то при наличии кафки можно паралельно несколько таких таблиц поддерживать на нодах
Join(Any,Left,id) settings join_any_take_last_row=1 а мощность event_source не будет равна мощности таблицы в этом случае? типа в event 100М и в event_source получим 100М
тут же Any. Там хеш таблица. Одна строка для одного id. По умолчанию - первая, с указанным сеттингом - последняя. Вы же говорили что источников десятки тысяч - это нормально. Вот так проверить сколько займет RAM: SELECT name, formatReadableSize(total_bytes) FROM system.tables WHERE engine = 'Join';
Обсуждают сегодня