gpt4 book ai didi

database-design - 在 mongoDB 中模拟一个问答站点

转载 作者:可可西里 更新时间:2023-11-01 10:07:43 26 4
gpt4 key购买 nike

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

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

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

用户有一个经常更新的声誉,当前的声誉应该一直和问题一起显示。

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

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

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

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

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

更新时,更新用户集合和嵌入用户,只显示用户时-使用用户

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

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

最佳答案

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

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

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

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

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

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

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

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

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

希望对您有所帮助。

关于database-design - 在 mongoDB 中模拟一个问答站点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6562576/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com