14

我正在开发一个可能有很多用户(比如说大约 100 万)的 android 移动应用程序。这些用户可以关注其他用户(如 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“用户关系”集合中获得数百万个条目。当然,我将在字段上设置一个索引,但我不太确定这个解决方案是否能很好地适应应用程序用户询问他/她当前关注者的用例。

我将不胜感激有关我的建模问题的任何想法和经验。也许任何人甚至有更好的解决方法。

提前很多。

4

3 回答 3

21
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
于 2013-01-22T13:11:37.083 回答
1

如果您还没有,我会先阅读有关在 CMS 中存储评论的文档。虽然它用于评论,但存在相同的普遍问题 - 您无法将所有评论存储在单个文档中(在您的情况下,关注者/关注者)。

Hybrid 方法(使用更少的文档并在单个文档中存储一些关系)或您描述的方法都应该很好用。

我还建议构建一个简单的 POC 来测试检索等的性能。缓存一些结果或预编译它们可能是有意义的。通常,在这样的系统中,如果所有用户的所有内容都不能立即保持一致(比如让追随者数量立即正确),那是可以的。

可能没有完美的解决方案,并且可能需要一些解决方案才能获得最佳性能(例如,处理用户和关注者的方式可能会随着关注者数量的增加而改变)。

于 2013-01-22T13:29:19.140 回答
-2

您可能需要检查flockDB 一个存储邻接列表的数据库。https://github.com/twitter/flockdb

于 2013-02-27T15:39:38.153 回答