【问题标题】:Storing Friend Relationships in MongoDB?在 MongoDB 中存储朋友关系?
【发布时间】:2011-09-05 04:54:18
【问题描述】:

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

来自 mysql,我有一个单独的表,其中包含有两个外键的朋友关系,每个外键都指向“友谊”中的一个朋友,但是,使用 MongoDB,它可能有引用数组甚至嵌入文档..那是什么存储这些关系的最佳方式

第一反应是我会在每个用户中存储一组朋友对象 ID,但这让我很困扰,因为那时,为了删除“友谊”,我必须删除两个朋友的文档,而如果我将关系存储在单独的集合(la SQL)中,我可以通过修改一个集合来删除或添加关系。

谢谢!

【问题讨论】:

  • 您所描述的更适合传统的 RDBMS,而不是无模式的产品。如果您使用 RDBMS 会容易得多。您选择 mongo 有什么特别的原因吗?
  • 嗨,约翰,对于朋友,我绝对同意。我选择 Mongo 是因为我要存储与朋友相关的非结构化数据。特别是,像标记和在一个字段中嵌入数组/引用的能力对于存储 cmets 等东西来说也非常酷。
  • 我知道您可能对 MongoDB 有心(我自己也很喜欢),但您可能需要一个图形数据库。

标签: mongodb


【解决方案1】:

我建议在用户中保留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,但这样的频率会少得多。但是在获取好友列表时查询较少,会经常使用。

【讨论】:

  • 听起来不错,我现在就去吧..这是有道理的。谢谢!
  • 优秀的答案,......“但频率会少得多”......好吧,解释......谢谢!!
  • @user2924127 当服务器启动时,它会清理表以查看谁与谁成为朋友?或者删除一个朋友的请求应该是原子的,但这取决于你的实现
  • 如果您想针对所有向您发送好友请求但不是好友的用户显示“添加好友”,您可以查询db.users.find({'_id':{'$nin': my_friend_ids, 'friend_ids': my_id}})。如果您想显示所有不是您朋友的用户,您可以省略第二个过滤器。
  • @Fluinc 我明白你在说什么。如果我们只存储 12 字节的 bson objectid,一个文档可以存储 130 万个朋友?如果我有很多这样的热门用户,我会将他们放入中间地图集合而不是用户集合中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多