我应该如何设计用户和朋友表时使用MongoDB (Rails)



我在一个社交网络类型的项目工作,建议的数据库是MongoDB。

我以前与各种项目合作过,并在关系数据库系统中设计了数据库,但因为我是NoSQL db (MongoDB)的新手。我被设计东西困住了。

考虑下面的例子,

1)应用程序将有用户和朋友表保存用户和用户的朋友的数据。

现在,下面的设计是正确的吗?

用户:

_id       username password other_fields
----------------------------------------
2gsyexej2 balan    adsfasf  ..

user_friends:

_id user_id friends
--------------------
1  2gsyexej2 friends
               - 0 
                 - friend_user_id = asdfdf23adfsasdf
               - 1
                  - friend_user_id = efex89sdfsw0dfssf
                        etc., 

在上面的模型中,我使用了"Manual Reference",从users表中获取用户id并在user_friends表中用作引用。

这个方法正确吗?如果不是,请建议一个更好的方法。

谢谢,

氟草胺

一个用户有30 000 000个好友。

认真呢?新浪微博是中国版推特上最大的粉丝,其人均粉丝数超过了Facebook和Twitter的总和,人均粉丝数约为2000万。然而,这是罕见的。

话虽这么说,像docs (http://docs.mongodb.org/manual/core/data-modeling/)和@jorscas建议的那样将好友关系放在根文档中是不明智的。

我可以很容易地想象,随着用户花更多的时间在网站上访问更多的朋友关系,文档会以持续快速的速度增长。这有两个原因,一是mongodb区段内的空间碎片,二是快速增长的文档可能需要在磁盘上移动,这本身就是一个缓慢而密集的操作。还有更多的原因,但这就足够了。

你还得考虑16meg的限制,即使8000个连接也会达到这个限制。

所以我已经说了不要嵌入。你知道如何在关系模型中设计它吗?我会这样做,在需要的时候去规范化,同时规范用户之间的关系。

要在mongodb中表示用户之间的关系,最自然的方式是在单个用户的集合中使用引用,如下所示:

{
 _id: ObjectId("5099803df3f4948bd2f98391"),
 username: "balan",
 password: "adsafs",
 ...
 other fields
 ...
 friends: [ ObjectId("5099803df3f4948bd2f2334445"), ..., ... ],
}

考虑到好友数量很大,需要sharding的情况,那么先前的结构可能很难找到合适的shard key。在这种情况下,我将使用单独的好友对集合:

{
  _id: ObjectId("..."),
  user_id: ObjectId("..."),
  friend_id: ObjectId("...")
}

最新更新