#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 миллиона друзей? И если бы у меня было много таких популярных пользователей, я бы поместил их в промежуточную коллекцию карт, а не в коллекцию пользователей.