2011-05-31 287 views
18

我想知道使用MongoDB存储朋友关系数据的最佳方式是什么?在MongoDB中存储好友关系?

来自mysql我有一个单独的表与朋友关系,有两个外键,每个指向一个朋友在“友谊”,但是,与MongoDB它可能有引用数组甚至嵌入文件..什么最好的方式来存储这些关系

立即的第一反应是,我会在每个用户存储一个朋友对象id的数组,但是,这麻烦了我,因为然后,为了消除“友谊”,我会对两个朋友的文档都进行删除,而如果我将关系存储在单独的集合(一种SQL语句)中,我可以通过修改一个集合来删除或添加关系。

谢谢!

+0

你所描述的更适合于传统的RDBMS,而不是模式更少的产品。如果你使用了RDBMS,会容易得多。你选择mongo的任何特殊原因? – JohnP 2011-05-31 04:58:35

+0

嗨,约翰,对于朋友,我绝对同意。我选择了Mongo是因为我要存储的非结构化数据与朋友相关。特别是像标签和在一个字段中嵌入数组/引用的功能对于存储注释等东西来说也非常酷。 – 2011-05-31 05:29:34

+0

我知道你可能在MongoDB上设置了自己的心(我自己喜欢它),但是你可能想要这是一个图形数据库。 – EhevuTov 2012-02-09 08:44:18

回答

26

在用户中保存friend_ids的列表,这是我会推荐的。一些原因,

1.你查询一个用户,你有所有朋友预先可用的列表。

2.通过查看相应的ID应该出现在用户的朋友列表中,也可以处理请求(待定,接受)。所以,我可以通过查询

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两个用户的好友列表,但这个频率会少得多。但是你在获取朋友列表时会少一些查询,这会频繁使用。

+0

听起来很不错,我现在就用这个​​..这很有道理。谢谢! – 2011-05-31 05:31:54

+0

优秀的答案,...“但频率会少得多”... 嗯,解释..谢谢! – dsignr 2012-02-08 20:19:18

+0

@simplyharsh哪一个你建议embedmany或参考很多? – 2015-04-29 19:24:04