gpt4 book ai didi

mysql - MongoDB——子子子?

转载 作者:行者123 更新时间:2023-11-29 11:48:59 24 4
gpt4 key购买 nike

在像 StackOverflow 这样的应用程序中(没有什么真正相关的,但它是一个很好的例子),我们有问题。我们 mongodb 集合中的每个 Question 都有一个 Answer 数组和一个 Vote 数组(赞成票或反对票)。

在每个答案中,用户都可以对其投赞成票或反对票。

所以架构看起来像这样:

Question
-> Answers []
-> Votes []
-> value (-1/1)
-> username
-> Votes []
-> value (-1/1)
-> username
-> question_text, etc.

来自 MySQL 的背景,这种模式感觉“恶心”,但我确信这是一种行业惯例。

现在,我当前需要向每个用户展示他们投票的内容,包括问题答案

因此,如果我必须找到用户投票的答案,我会这样查询(在 Node 中):

question_collection.find(
{'question.answers.votes.username': username}, function(e,d) {
/* do stuff */}
);

该查询有 4 层深度。这是正常的方法还是我应该在模式中引入一些规范化?

最佳答案

MongoDB 的优势之一是您可以将有关 Question 的所有相关信息放入一个文档中,因此您只需 1 个数据库查询,无需连接即可获取所有信息来呈现 问题

但是,如果您想查找用户投票的所有内容,事情就会变得有点复杂。当然,您可以做您所做的事情,尽管它不会赢得任何绩效奖。

或者,您可以以智能方式复制数据,以便以更轻松的方式访问数据。例如,您可以向 User 模型添加两个数组:

QuestionsVoted: [{ id1: +1}, {id2: -1}, {id3: +1}],
AnswersVoted: [{ id4: +1}, {id5: -1}]

这意味着您需要保持这些数据同步:当用户对问题或答案进行投票时,您需要更新问题和用户。这并没有那么糟糕,因为数据写入很少,读取却很频繁。

如果您有处理投票本身的其他要求,例如一段时间内或按地理区域的投票统计数据,您可能需要创建一个 Vote 集合。是的,您必须在 3 个集合之间保持数据同步。

技术上可以在 MongoDB 中创建外键,但在这种情况下我不建议这样做。您将失去 MongoDB 的一些优势,因为它不擅长连接(它需要 2 个单独的查询)。

您可以阅读有关如何在 MongoDB 中设计关系的更多信息 on their blog .

关于mysql - MongoDB——子子子?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34481409/

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