Enuriru
@Enuriru
Дизайнер, веб-разработчик

Как эффективно хранить «связность» между пользователями?

Приветствую!

Имеется алгоритм, вычисляющий показатель (число), характеризующий отношение пользователя А к пользователю В.
Алгоритм транзитивный, симметричный, т.е. A->B = B->A.

С ростом числа пользователей потребуется хранить результаты и пересчитывать их (например, при изменении некоторых параметров пользователя A нужно пересчитать его отношение ко всем остальным).

Встает вопрос, как эффективно хранить, быстро обновлять и считывать такие данные? SQL, NoSQL? Какой движок/база подойдет лучше? Ведь всего на 1000 пользователей будет уже 1 000 000 записей.

Спасибо!
  • Вопрос задан
  • 2587 просмотров
Пригласить эксперта
Ответы на вопрос 4
uvelichitel
@uvelichitel
habrahabr.ru/users/uvelichitel
  • Транзитивность в моем понимании означает
    A->B + B->C = A->C
  • Среди тысячи пользователей вряд ли все связны.

В таких посылках речь идет о связности графа. Иерархические структуры данных(дерево, граф) инородны для реляционной алгебры SQL. Известные решения Adjacency list и Nested sets. Adjacency list требует применения WITH RECURSIVE. Nested sets предполагает очень много пересчета при операциях(особенно INSERT).
Нужную вам модель данных было бы удобней реализовать в hierarchical DB (например просто hierarchical key value, Redis или levelDB сойдет) или graph DB или документарной DB (например просто в XML который в сути своей иерархичен)
Ответ написан
@SeptiM
Если алгоритм задает метрику, и готовы пожертвовать точностью, можно всех пользователей отобразить в O(log n)-мерное пространство. В худшем случае расстояния испортятся в O(log n), но при этом можно хранить всего O(n log n) бит информации.
Ответ написан
Комментировать
@mickvav
Programmer, system and network administrator
Вам точно нужно хранить эту циферку таки для всех? Если только для тех, у кого она меньше/болше некоего порога - то это O(N) или O(NlogN), что уже влезет в обычный SQL, а не O(N^2), что действительно плохо.
Ответ написан
targetjump
@targetjump
думаю neo4j именно то, что Вам нужно
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы