模拟Q& mongoDB中的一个站点

时间:2011-07-03 11:24:08

标签: database-design mongodb data-modeling

我需要为Q&像mongoDB中的stackoverflow这样的网站,这是我的主要问题。

我有两个主要对象 - 问题和用户(只是忘记其他人喜欢答案......)。

用户提出问题。我需要始终向用户显示问题。可以搜索问题并浏览所有问题。更安全的是,用户会问少于1000个问题。

用户的声誉经常更新,目前的声誉应始终显示在问题中。

解决方案1:将用户嵌入问题 -

无需执行连接,但当用户信誉发生变化时,应更新所有相关问题。并不容易显示单个用户

解决方案2:将用户和问题建模为单独的集合(就像在RDBMS中一样) -

现在更新声誉不是问题但是每次检索问题时都需要在用户之间进行联接并提出问题。就像在RDBMS中一样。此外,mongoDB没有连接,连接实际上是2个调用 - 1个用于获取问题,另外1个用于获取用户,因此如果要检索100个问题,则将有100个调用以获得100个单独的用户 - 不是很好

解决方案3:将用户嵌入问题中并为用户设置单独的收藏

更新时,更新用户集和嵌入式用户,仅显示用户 - 使用用户

那我应该使用哪一个?或者最好用像MySQL这样的RDBMS来解决? mongoDB中的字段更新速度有多快?

我喜欢使用mongo,因为它的速度和容易将读取请求路由到副本和分片(如果我的网站是从单个服务器生长出来的,那么不太可能;()

2 个答案:

答案 0 :(得分:3)

解决方案1 ​​对我而言的助听器就像未完成一样,因为无论如何你都应该拥有所有用户的存储空间。

解决方案2 也可以是一个解决方案,并且它可能比任何rdbms都好,因为在文档数据库中你不能进行“真正的”连接,这意味着你可以轻松扩展你的系统

如果您的系统不像SO那么大,只需选择解决方案#2。

解决方案3 您无需在问题中嵌入所有用户信息,只需嵌入您需要显示的信息。

高可扩展系统的最佳解决方案将是:

Users - 所有用户相关信息的主要商店,此外您还可以提供问题计数,信誉,答案数和您需要的任何统计数据

Questions {ShortUserInfo {UserName, Reputation, GoldBadgetsCount, ...} } - 存储您需要显示的用户相关信息的问题

Answers特定问题也应该嵌入问题中。并且可能还会包含ShortUserInfo(或左右)。

解决方案#3为您提供轻松扩展系统的能力,并使其超快速。但是当用户更新他的个人资料(或声誉)时,你应该在每个问题/答案中更新这些信息,但是你可以将这项工作视为异步,在这种情况下,信息可能会陈旧一段时间,但没关系。您可以更改您的SO个人资料,并在某些问题/答案中看到您的用户名仍旧。

希望这会对你有所帮助。

答案 1 :(得分:0)

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

您可能会发现有用的架构设计演示文稿和视频。