В настоящее время я изучаю бэкэнд для использования в проекте с высокими требованиями к агрегированию данных. Основные требования проекта следующие.
Храните миллионы записей для каждого пользователя. Пользователи могут иметь более 1 миллиона записей в год, поэтому даже с 100 пользователями мы говорим о 100 миллионах записей в год.
Агрегирование данных по этим записям должно выполняться на лету. Пользователи должны иметь возможность фильтровать записи по тонне доступных фильтров, а затем представлять сводки (итоги, средние значения e.t.c) и графики результатов. Очевидно, что я не могу предварительно рассчитать какие-либо результаты агрегации, потому что комбинации фильтров (и, следовательно, наборы результатов) огромны.
Пользователи будут иметь доступ только к своим данным, но было бы неплохо, если бы для всех данных была рассчитана анонимная статистика.
Данные будут большую часть времени в пакетном режиме. например, пользователь будет загружать данные каждый день, и ему может понравиться 3000 записей. В некоторых более поздних версиях могут быть автоматизированные программы, которые загружают каждые несколько минут, например, небольшими партиями по 100 наименований.
Я провел простой тест, создав таблицу с 1 миллионом строк и выполнив простую сумму в 1 столбец как в mongodb, так и в mysql, и разница в производительности была огромной. Я не помню точные цифры, но это было что-то вроде mysql = 200 мс, mongodb = 20 сек.
Я также сделал тест с помощью couchdb, и результаты были намного хуже.
Что кажется многообещающим в отношении скорости, так это Кассандра, которой я был очень рад, когда впервые ее обнаружил. Однако документации недостаточно, и я не нашел убедительных примеров того, как выполнять суммы и другие агрегатные функции в данных. Это возможно?
Как видно из моего теста (возможно, я сделал что-то не так) с текущей производительностью, невозможно использовать mongodb для такого проекта, хотя функциональность автоматического шардинга кажется идеально подходящей для него.
Есть ли у кого-нибудь опыт агрегирования данных в mongodb или есть какие-то идеи, которые могут помочь при реализации проекта?
Спасибо,
Димитрис