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

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

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

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

Спасибо!

 EhevuTov09 февр. 2012 г., 09:44
Я знаю, что вы, вероятно, настроены на MongoDB (мне самому это нравится), но вам, вероятно, нужна графическая база данных для этого.
 Andy Tsen31 мая 2011 г., 07:29
Привет Джон, для друзей, я определенно согласен. Я выбрал Mongo из-за неструктурированных данных, которые я буду хранить, связанных с друзьями. В частности, такие вещи, как тегирование и возможность встраивать массивы / ссылки в одно поле, тоже были действительно полезны для таких вещей, как хранение комментариев и т. Д.
 JohnP31 мая 2011 г., 06:58
То, что вы описываете, гораздо больше подходит для традиционных СУБД, чем для схемы, менее предлагаемой. Было бы намного проще, если бы вы использовали СУБД. По какой-то конкретной причине вы выбрали монго?

Ответы на вопрос(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 из списка друзей обоих пользователей, но частота будет намного меньше. Но вы меньше запрашиваете список друзей, который будет часто использоваться.

 dsignr08 февр. 2012 г., 21:19
Отличный ответ ... "но частота для этого была бы намного меньше" ... Ну, объяснил .. спасибо !!
 simplyharsh29 нояб. 2018 г., 10:55
@Fluinc Я понимаю, что вы говорите. если мы храним только 12-байтовый объект bson, один документ может хранить как 1,3 миллиона друзей? И если бы у меня было много таких популярных пользователей, я бы поместил их в коллекцию промежуточных карт, а не в коллекцию пользователей.
 Andy Tsen31 мая 2011 г., 07:31
Звучит хорошо, я пойду с этим сейчас .. это имеет смысл. Спасибо!
 Tudor04 июн. 2016 г., 14:12
@ user2924127 как насчет того, когда сервер запускается, он очищает таблицы, чтобы узнать, кто с кем дружит? или удаление запроса одного друга должно быть атомарным, но это зависит от вашей реализации
 simplyharsh30 апр. 2015 г., 00:25
Ссылка @MarcelDjaman многие должны служить цели.

Ваш ответ на вопрос