Значна частина відповіді залежить від того, що ви хочете з нею зробити після того, як її буде зібрано. Зберігати велику кількість даних легко: просто закиньте їх у файли журналів, не потрібно бази даних. З іншого боку, якщо ви хочете виконати складний аналіз та видобуток даних на ньому, тоді корисна база даних.
Наступне питання - який аналіз ви збираєтеся робити. Чи буде це виконуватися для підмножини даних, що мають певну властивість, лише останню годину / день / тиждень / місяць, чи можуть дані агрегуватися або якимось чином попередньо обчислюватися? Іншими словами: чи потрібен вам доступ до всього набору даних у формі, в якій він зібраний? Чи можете ви архівувати дані, коли вони старіють, щоб бути цікавими? Чи можете ви агрегувати дані та проводити аналіз на агрегації?
З мого досвіду роботи з рекламною аналітикою (збір мільярдів точок даних про показ реклами) агрегування є ключовим. Ви збираєте необроблені дані, дезінфікуєте їх, а потім поміщаєте в базу даних, як-от MongoDB, Cassandra або навіть MySQL, що дозволяє робити оновлення та запити. Потім ви періодично узагальнюєте дані та видаляєте їх із бази даних (але необроблені дані архівуйте, вони можуть вам знадобитися пізніше).
Агрегація по суті задає всі питання, які ви хочете задати щодо даних, і зберігає їх у формі, яка полегшує отримання відповіді на конкретне питання. Скажіть, що ви хочете знати, в який день тижня найбільше X. Наївна реалізація цього полягала б у збереженні всіх записаних сигналів у величезній таблиці та виконанні запиту, який підсумовує всі рядки, які мають X. Як кількість зібраних сигнали зростають, цей запит триватиме довше і довше. Жодна індексація, шардінг або оптимізація в цьому не допоможе. Замість цього кожен день / годину / хвилину (залежно від конкретного випадку використання та того, наскільки актуальною має бути ваша звітність), ви переглядаєте нові сигнали, які ви записали, і для кожного X збільшуєте лічильник, який відстежує, скільки X були в понеділок, якщо це понеділок, вівторок, якщо вівторок тощо. Таким чином ви зможете пізніше отримати підрахунок за кожен день тижня та порівняти їх. Ви робите це для всіх питань, на які ви хочете мати можливість відповісти, а потім видаляєте сигнали з бази даних (але знову ж таки зберігайте необроблені дані).
Тип бази даних, в який ви записуєте агрегати, може бути таким же, як і той, в якому ви зберігаєте вхідні сигнали, але він не повинен бути дуже вигадливим. У ньому будуть зберігатися ключі, що представляють конкретну відповідь, і значення, які зазвичай є просто цифрами.
У системі зберігання даних старої школи говорять, що база даних, в якій ви зберігаєте вхідні сигнали, називається OLTP (для он-лайн обробки транзакцій), а база даних, в якій ви зберігаєте агрегати, називається OLAP (для онлайнової аналітичної обробки). OLTP оптимізовано для вставки, а OLAP - для запитів. Терміни застарілі, і коли люди їх чують, вони, як правило, відразу ж замислюються над SQL і про "зіркові схеми" і про все таке. Можливо, мені не слід ними користуватися, але це зручні терміни.
У будь-якому випадку, для OLTP вам потрібне щось, що швидко вставляє дані, а також те, що підтримує індексацію даних та пошук речей. Агрегації дуже допомагає база даних, яка виконує половину роботи підсумовування та пошуку максимумів і мінімумів. Мені дуже подобається MongoDB, оскільки його так легко налаштувати та працювати з ним. Дані, з якими я працюю, як правило, брудні, і не всі предмети мають однаковий набір властивостей, тому прощаюча безсхемність Монго є благом. З іншого боку, ваші дані звучать набагато одноманітніше, тому Монго, можливо, не дасть вам стільки переваг. Хоча все-таки не забувайте про старі добрі реляційні бази даних. Якщо ви збираєтеся робити багато підсумовувань тощо, тоді SQL чудовий, для цього він створений.
Для OLAP працює щось набагато простіше, сховище ключ-значення - це все, що вам потрібно. Я використовую Redis, тому що з ним дуже легко працювати і налаштовувати. Це також дозволяє зберігати більше скалярних значень, що зручно. Іноді вашим значенням є насправді список або хеш, у більшості сховищ ключ-значення вам доводиться кодувати такі значення, але Redis обробляє це спочатку. Недоліком Redis є те, що ви не можете робити запити ("як, наприклад, дайте мені всі рядки, що мають це значення для Y"), ви повинні зберігати індекси своїх даних самостійно. З іншого боку, вам дуже не знадобляться індекси, оскільки відповіді на всі ваші запитання були попередньо обчислені, все, що вам потрібно зробити, це шукати відповідь за допомогою ключа, який визначається запитанням. Для вищезазначеного питання, в який день тижня найбільше X, ви шукаєте кількість X робочих понеділка, вівторка тощо, можливо, ви '
На закінчення: MongoDB та Redis чудово працюють для мене. Я не думаю, що MongoDB дуже добре підходить для вашого випадку використання, натомість я думаю, що ви насправді можете отримати більше користі від традиційної бази даних SQL (але це залежить, якщо ваші дані дійсно прості, ви, можливо, можете використовувати Redis до кінця). Найголовніше - не помилитися, думаючи, що вам потрібно мати дані в одній базі даних і зберігати їх назавжди. Агрегація та викидання старих даних є ключовим фактором.