Задать вопрос
Enuriru
@Enuriru
Дизайнер, веб-разработчик

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

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

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

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

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

Спасибо!
  • Вопрос задан
  • 2588 просмотров
Подписаться 3 Оценить 2 комментария
Помогут разобраться в теме Все курсы
  • Яндекс Практикум
    Инженер по тестированию
    5 месяцев
    Далее
  • Skillbox
    Старт в DevOps: системное администрирование для начинающих
    4 месяца
    Далее
  • Thinknetica
    Профессиональная разработка на Ruby on Rails
    9 месяцев
    Далее
Пригласить эксперта
Ответы на вопрос 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 именно то, что Вам нужно
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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