【问题标题】:Model a Q & A site in mongoDB在 mongoDB 中建模一个问答网站
【发布时间】:2011-09-27 14:25:45
【问题描述】:

我需要在 mongoDB 中为类似 stackoverflow 的问答网站建模,这是我的主要问题。

我有 2 个主要对象 - 问题和用户(忘记答案等其他对象......)。

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

用户的声誉会经常更新,当前的声誉应始终与问题一起显示。

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

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

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

现在更新信誉不是问题,但每次检索到问题时都需要在用户和问题之间进行连接。就像在 RDBMS 中一样。此外,mongoDB 没有连接,连接实际上是 2 次调用 - 1 次获取问题,另外 1 次获取用户,因此如果要检索 100 个问题,将有 100 次调用来获取 100 个单独的用户 - 不好.

解决方案 3:将用户嵌入问题中,并为用户提供单独的集合

更新时,更新用户集合和内嵌用户,只显示用户时——使用用户

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

我喜欢使用 mongo,因为它的速度和轻松将读取请求路由到副本和分片(如果我的网站是从单个服务器发展而来的,这无论如何都不太可能;()

【问题讨论】:

    标签: database-design mongodb data-modeling


    【解决方案1】:

    解决方案 1 对我来说听起来像是不完整的,因为无论如何您都应该拥有所有用户的存储空间。

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

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

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

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

    Users - 所有用户相关信息的主要存储,此外,您可以在这里拥有问题计数、声誉、答案计数和您需要的任何统计数据

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

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

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

    希望这会对你有所帮助。

    【讨论】:

      【解决方案2】:

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

      有一些架构设计演示文稿和视频,您可能会发现它们很有用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-04
        • 2019-06-17
        相关资源
        最近更新 更多