你需要尝试两者。
简单地说——这里真的没有正确的答案。它会因您的要求、架构或文档结构、查询、索引、硬件、您对分片的意愿(和硬件的可用性)等而有很大差异。
两者都适用于您想要实现的目标,并且对于这些类型的问题都有自己的解决方案 - 例如:foreign keys and joins vs embedded documents
或sharding vs partitioning
. 正确完成后,两个数据库都可以很好地工作。
随着您的扩展,您的性能改进很可能包括缓存、预聚合/预处理、mapreduce 等 - 无论您选择哪种数据库后端。
以 MongoDB 为例:
听起来最近的活动是观看次数最多的——这应该意味着即使您的收藏增加,您的工作集理论上也应该保持较小。因此,您可以为每个用户每天创建一个文档,其中包含每个活动的嵌入式文档。
{
_id: ObjectId(...),
user: 123,
timestamp: 1370847600,
activities: [
{ _id: ObjectId(...), type: 1, msg: "Something was logged.", date: IsoDate(...) },
{ _id: ObjectId(...), type: 2, msg: "Something else was logged.", date: IsoDate(...) },
//More Activities here...
]
}
如果您觉得一天不够细,或者您觉得您的文件太大,请按小时分组。这将有助于保持索引大小/工作集合理,并允许您在没有连接的情况下获取多个活动。
但是,您也可能会发现在仅按类型或日期查询活动日志时需要更大的灵活性——在这种情况下,嵌入可能无法正常工作。