我正在开发一款可能拥有大量用户的Android移动应用程序(假设大约有100万用户)。这些用户可以关注其他用户(如Twitter)。该应用程序通过远程REST后端同步用户数据。用户数据本身保存在面向文档的数据库中(在我的例子中,它是MongoDB)。
目前我问自己设计用户模型的最佳方式,包括其关注者和以下关系。首先想到的是将关系嵌入用户文档中。
示例用户文档:
{
"_id":"50fd6bb530043e3c569af288",
"name":"Marsha Garcia",
"follower"["50fd6bb530043e3c569af287","50fd6bb530043e3c569af289","50fd6bb530043e3c569af28c"],
"following":["70fd6bb530043e3c569af289","10fd6bb530043e3c569af222","89fd6bb530043e3c569af45o"]
}
积极的是,跟随/关注关系已经与用户联系在一起。但是,假设用户跟随大约100.000或更多其他用户。然后文档大小将变得非常大。如果我在移动应用程序中通过REST服务加载此用户对象,可能需要一段时间。此外,在最坏的情况下,用户文档可能超过MongoDb 16MB文档限制。
因此,我的第二个想法是以更经典的方式模仿追随者和关系:一个包含每个用户的以下关系的额外文档。
示例'用户关系'文档:
{
"_id": 50fe65828de290c0a8a8ea2d"
"uid": "50fd6bb530043e3c569af288",
"rel_uid": "50fe65828de290c0a8a8e9a6",
"type": "FOLLOWING"
}
积极的是每个用户文档的大小将保持不变。缺点是,有很多用户和以下关系,我可以很容易地在我的MongoDB'用户关系'集合中获得数百万条目。当然我要在字段上设置一个索引,但是我不太确定这个解决方案是否能够很好地扩展应用程序用户请求他/她当前关注者的用例。
我很感激有关我的建模问题的任何想法,经验。也许任何人都有更好的解决方案。
提前很多。
答案 0 :(得分:19)
1. collection users:
- userid
- username
- userpass
- other user specific info user
2. collection following:
- userid
- [array of followingid]
3. collection followed:
- userid
- [array of followedid]
4. messages_relation collection:
- userid
- messageid
- time
5. messages_text:
- messageid
- text
答案 1 :(得分:1)
我首先阅读有关在CMS中存储评论的this文档,如果您还没有。虽然它是用于评论,但存在同样的一般问题 - 您无法将所有评论存储在单个文档中(在您的情况下,关注者/关注者)。
混合方法(使用较少的文档并在单个文档中存储一些关系)或者您描述的方法应该运行良好。
我还建议构建一个简单的POC来测试检索的性能等。缓存某些结果或预编译它们可能是有意义的。通常情况下,如果所有用户的所有内容都不是即时一致的(例如,跟随者数量是正确的),在这样的系统中就可以了。
可能没有一个完美的解决方案,并且可能需要一些解决方案以获得最佳性能(例如,用户和关注者的处理方式可能随着关注者数量的增加而变化)。
答案 2 :(得分:-1)
您可能想要检查flockDB是否存储邻接列表的数据库。 https://github.com/twitter/flockdb