用户作为经常更改的状态(比方说每秒),它还具有不同的特征,例如国家/地区(每个用户最多10k个特征)...... 用户可以发布具有不同类型的消息。
在我看来,这个场景非常面向RDS,其中JOIN
将被用于查询。但是,它不是一种选择(为了练习)。因此,我不是在寻找具有伪RDS的解决方案,如HIVE或其他具有伪连接的解决方案。我正在寻找可以使用mongodb
或mapreduce
的{{1}}之类的内容。
假设你有3个收藏品:
解决这个问题的可行方法(据我所知)是:
aggregation
(或将所有内容放在一个集合中)=>似乎没有优化,因为你有每个用户的很多特性,你将达到2MB的文件限制(你可以使用GridFS,但我担心这样的性能,你还复制了大量无用的数据存储) embed
来使用类似SQL的解决方案。似乎是一个合理的解决方案。但是,如果您确实想要进行reference
之类的特定查询,则会陷入困境(就查询性能而言)。在SQL中,它将是count the number of message of type X for users that have their last status equal to Z and have characteristic Y equal to E and group them by characteristic W
(此查询实际上并不完全符合您的要求知道最后一个状态是否等于Z而不是如果状态等于Z,则需要在选择内选择但不是练习点。在你必须进行多次查询的情况下,它变得非常苛刻(在这个示例中,一个用于获取最后状态等于Z的用户id,然后另一个用于将此用户id列表过滤到具有等于E的特征Y的那个,然后从这些用户获取所有消息,然后按特征W将其分组,并使用地图缩减作业。我使用了选项2,但我对此感到不满,因为查询它的处理时间似乎不会优化。
在上述场景中,实现可扩展解决方案的最佳实践是什么,允许复杂查询,如上面给出的示例。