在MongoDB中建模一个问答网站

3
我需要在MongoDB中建模一个类似于stackoverflow的问答网站,以下是我的主要问题:
我有两个主要对象-问题和用户(忘记其他的如答案等...)。
用户提出问题。我需要始终显示提出问题的用户。可以搜索问题并浏览所有问题。用户会提出少于1000个问题。
用户有一个经常更新的声望,并且当前声望应始终与问题一起显示。
解决方案1:将用户嵌入问题中 - 无需执行连接,但当用户声望更改时,应更新所有相关问题。而且难以显示单个用户。
解决方案2:将用户和问题作为单独的集合进行建模(就像在关系型数据库中一样)-现在更新声望不是问题,但每次检索问题时都需要在用户和问题之间进行连接。就像在关系型数据库中一样。此外,MongoDB没有连接,连接实际上是2个调用-1个用于获取问题,另一个用于获取用户,因此如果要检索100个问题,则需要100个调用以获取100个单独的用户-不好。
解决方案3:将用户嵌入问题中,并为用户拥有单独的集合
在更新时,更新用户集合和嵌入式用户,在仅显示用户时-使用用户
那么我应该使用哪种?还是最好使用像MySQL这样的关系型数据库解决?MongoDB中的字段更新速度有多快?
我很想使用Mongo,因为它的速度和易于将读请求路由到副本和分片(如果我的网站从单个服务器扩展出来,这是不太可能的;()
2个回答

3
解决方案1 对我来说似乎不完整,因为无论如何您都应该拥有所有用户的存储。 解决方案2 也可以是一个解决方案,它可能比任何关系型数据库更好,因为在文档数据库中,您无法进行“真正”的连接,这意味着您可以轻松扩展系统。
如果您的系统不像SO那么大,只需选择解决方案#2。 解决方案3 您不需要在问题中嵌入所有用户信息,只需嵌入您需要显示的信息即可。
因此,高可扩展性系统的最佳解决方案将是: Users - 所有用户相关信息的主要存储,此外,您可以拥有问题计数、声望、答案计数和任何您需要的统计数据 Questions {ShortUserInfo {UserName, Reputation, GoldBadgetsCount, ...} } - 存储具有所需的用户相关信息的问题 Answers 特定问题的答案也应嵌入问题中。并且可能还包含ShortUserInfo(或类似)。
解决方案#3使您能够轻松扩展系统并使其超级快速。但是,当用户更新其个人资料(或声望)时,您应该在每个问题/答案中更新此信息,但您可以异步执行此工作,在这种情况下,信息可能会过时一段时间,但这没关系。您可以更改SO配置文件并查看您的用户名仍然可以在某些问题/答案上旧。
希望这可以帮助您。

1

有不同的方法可以做到这一点,但我可能会有: - 一个用户集合 - 一个问题集合。在一个问题文档中,我会嵌入一个答案对象数组

有关模式设计的演示和视频,你可能会发现它们很有用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接