Сохранение отношений с друзьями в MongoDB?

#mongodb

#mongodb

Вопрос:

Мне было интересно, какой наилучший способ хранения данных о взаимоотношениях с друзьями с использованием MongoDB?

Исходя из mysql, у меня была отдельная таблица с отношениями с друзьями, в которой было два внешних ключа, каждый из которых указывал на друга в разделе «дружба», однако с MongoDB возможно иметь массивы ссылок или даже встроенные documents..so каков наилучший способ сохранить эти отношения

Однако первой реакцией было то, что я бы сохранил массив идентификаторов объектов friend у каждого пользователя, что меня беспокоит, потому что тогда, чтобы удалить «дружбу», мне пришлось бы удалить документы обоих друзей, тогда как если бы я сохранил отношения в отдельной коллекции (а-ля SQL), я мог бы удалить или добавить отношения, просто изменив одну коллекцию.

Спасибо!

Комментарии:

1. То, что вы описываете, гораздо больше подходит для традиционной СУБД, а не для предложения без схемы. Было бы намного проще, если бы вы использовали RDBMS. Есть какая-то конкретная причина, по которой вы выбрали mongo?

2. Привет, Джон, что касается друзей, я определенно согласен. Я выбрал Mongo из-за неструктурированных данных, которые я бы хранил, связанных с друзьями. В частности, такие вещи, как пометка и возможность встраивать массивы / ссылки в одно поле, тоже были действительно классными для таких вещей, как хранение комментариев и т.д.

3. Я знаю, что вы, вероятно, всем сердцем привязаны к MongoDB (мне самому это нравится), но вам, вероятно, нужна графическая база данных для этого.

Ответ №1:

Я бы порекомендовал хранить список friend_ids у пользователя. Несколько причин,

1. Вы запрашиваете пользователя, и у вас есть заранее доступный список всех друзей.

2. Запросы (ожидающие, принятые) также можно обработать, убедившись, что соответствующие идентификаторы должны присутствовать в обоих списках друзей пользователя. Итак, я могу получить список реальных и принятых друзей, запросив

 my_id, my_friend_ids = user._id, user.friend_ids
my_friends = db.users.find({'_id':{'$in': my_friend_ids}, 'friend_ids': my_id})
  

Да, при удалении дружбы вам придется $pull удалять из списка друзей обоих пользователей, но частота этого была бы намного меньше. Но вы меньше запрашиваете при получении списка друзей, который часто использовался бы.

Комментарии:

1. Звучит неплохо, я соглашусь с этим для now..it имеет смысл. Спасибо!

2. Отличный ответ, … «но частота для этого была бы намного меньше»… Ну, объяснил .. спасибо!!

3. @user2924127 как насчет того, чтобы при запуске сервера он очищал таблицы, чтобы увидеть, кто с кем дружит? или удаление запроса одного друга должно быть атомарным, но это зависит от вашей реализации

4. Если вы хотите показать «Добавить друга» для всех пользователей, которые отправили вам запрос в друзья и не являются друзьями, вы можете запросить db.users.find({'_id':{'$nin': my_friend_ids, 'friend_ids': my_id}}) . Вы можете не использовать второй фильтр, если хотите показать всех пользователей, которые не являются вашими друзьями.

5. @Fluinc Я понимаю, о чем вы говорите. если мы храним только 12-байтовый идентификатор объекта bson, в одном документе может храниться около 1,3 миллиона друзей? И если бы у меня было много таких популярных пользователей, я бы поместил их в промежуточную коллекцию карт, а не в коллекцию пользователей.