2013-01-16 51 views
1

我在一个社交网络类型的项目,建议的数据库是MongoDB。我应该如何设计用户和朋友表时使用MongoDB(Rails)

我以前曾与各种项目合作过,并且在关系数据库系统中设计过数据库,但是因为我是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., 

在上述模型中,我已经使用 “手动参考”,把从用户表 的用户ID,并用它作为在user_friends表中引用。

这种方法是否正确?如果不是,请提出更好的方法。

感谢,

巴兰

+1

阅读这些文档:http://docs.mongodb.org/manual/core/data-modeling/它们很好地涵盖了这些类型的问题。如果你有更具体的问题,我建议你更新你的问题。 – WiredPrairie

回答

2

一个用户有30周000 000的朋友。

认真吗?中国版新浪微博中最受关注的是,Facebook和Twitter合起来的每个人的追随者人数相当于一个人的2000万人。然而,这很少见。

这就是说,将文档作为文档(http://docs.mongodb.org/manual/core/data-modeling/)和@jorscas所建议的根文档中的朋友关系根本不明智。

我可以很容易想象,随着用户在访问更多朋友关系的网站上花费更多时间,文档以持续快速增长。这可能有两个原因,一个是MongoDBs范围内的空间碎片化,另一个是因为快速增长的文档可能需要在磁盘上移动,这本身是一个缓慢且密集的操作。有更多的原因,但这就够了。

您还必须考虑16meg的限制,即使是8,000个连接也会达到此限制。

因此,我已经说过不要嵌入。你知道你将在关系模型中设计的方式吗?我会这样做,在需要时规范化用户之间的关系时进行非规范化。

+0

所以我应该存储在像'user_id friend_id'这样的模型中,并为每个朋友关系添加单独的行,就像我们在MongoDB中的关系数据库中所做的那样? – balanv

+0

@balanv事实上,这似乎是一个过大的关系(并可能在这方面进行查询)打入嵌入式文档 – Sammaye

+0

,但如果我这样做,那么我不能充分利用NoSQl。 和数据将仍然存储像关系数据模型..没有其他解决方案呢? – balanv

0

为了表示MongoDB中最自然的方式在用户之间的关系,将是通过以下方式单个用户的集合内使用references

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

鉴于当朋友的数量很大并且需要sharding时,那么之前的结构可能难以找到合适的shard key。在这种情况下,我会用一个单独的朋友,对收集:

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

One user has 30 000 000 friends。什么样的分区将是最好的? – iddqd

+0

这是一个真正的用例吗? – joscas

+0

是的,用户 - >网页,朋友 - >页面视图(ip,时间,独特的cookie val)我有一些基于MySql的解决方案(现在db大小是20TB)。 – iddqd

相关问题