0

我正在开发一个 Rails 应用程序,它实现了一些社交网络功能,如关系、关注等。到目前为止,一切都很好,直到我遇到了多对多关系的问题。如您所知,mongo 缺少连接,因此推荐的解决方法是将关系存储为两个相关文档上的 id 数组。好的,这有点多余,但它应该可以工作,让我们说:

field :followers, type: Array, default: []
field :following, type: Array, default: []


def follow!(who)
  self.followers << who.id
  who.following << self.id
  self.save
  who.save
end

这工作得很好,但这是我们需要事务的情况之一,呃,但 mongo 不支持事务。如果 id 被添加到 'followed' 关注者列表而不是 'follower' 关注列表中怎么办?我的意思是,如果第一个文档被正确修改,但第二个文档由于某种原因无法更新。

可能是我太悲观了,但没有更好的解决方案?

4

1 回答 1

0

我建议只在一个方向存储关系,将某人关注的用户存储在他们的用户文档中作为“关注”。那么如果需要查询用户U1的所有follower,可以查询,{users.following : "U1"} 因为可以对数组进行多键索引,如果对这个字段进行索引,查询会很快。

仅朝那个方向发展的另一个原因是单个用户对他们可能关注的不同用户的数量有实际限制。但是,真正受欢迎的用户可能拥有的关注者数量可能接近您系统中的用户总数。您希望避免在可能很大的文档中创建数组。

于 2012-06-15T21:00:11.543 回答