gpt4 book ai didi

google-cloud-firestore - Firestore - 什么是最适合我的场景的数据结构?

转载 作者:行者123 更新时间:2023-12-02 03:08:56 27 4
gpt4 key购买 nike

我正在努力为我的应用寻找最佳架构。我应该使用顶级集合、子集合、数组等吗?

设置:

  1. 我的应用程序将有许多用户将参与的测验。
  2. 每个测验都会有多个问题。
  3. 每个问题都有多个答案,只能选择一个。
  4. 每个用户只能回答每个测验一次。

要求:

  1. 我需要存储每个用户的回复,并能够在用户级别进行报告。
  2. 我需要查看每个测验、每个问题、答案数量的汇总结果。

感谢任何帮助。

最佳答案

我认为从基础开始,希望自始至终都有凝聚力。以下每个部分似乎都是独立工作的,您可能会发现将某些内容放在文档中而不是它们自己的集合中,或者维护子集合而不是根集合等在一起是有意义的:

  • 每个测验都可以在集合测验中拥有自己的文档。
  • 每个问题(及其可能的答案)都可以在问题集合中拥有自己的文档。
  • 问题的每个答案都可以在集合answers中有自己的文档,以避免将答案与问题一起存储。
  • 用户中的每个用户
  • 每个用户的答案,在users/quizzes

您可以考虑将问题嵌套在测验中,但您可能希望将它们保留在根级别,以便您可以轻松地将问题重复用于多个测验。

因此可能值得在每个问题的文档中保留一个数组,该问题属于该问题的测验。

然后您可以执行这样的查询以获取测验的所有问题:

db.collection('questions').where('quizzes','array-contains', quizId)

这将为您提供每个测验的所有问题并满足您的第二个要求(并且第一个已经满足)。

问题会附带潜在的答案,我认为每个问题都应该有自己的 ID。像这样:

-- question1
----- "Do you xyz?"
----- potentialAnswers
--------- { id: xyz123, answer: "Yes" }
--------- { id: wxy456, answer: "No" }

这允许您做的是获取用户给出的每个答案,并查询以查看答案数据库中是否存在匹配项。

到目前为止我喜欢这个,因为它允许您查询所有问题,并且您可以在一个查询/一个有组织的列表中获得所有可能的答案。您可以在显示潜在答案时重新排列它们,因此每次显示的多项选择中的“C”不必总是相同的“C”。只要你去比较的时候ID是匹配的,你就是可靠的。

该比较可能如下所示:

db.collection('answers').where('questionId','==', 'question1').where('answerId', '==', 'xyz123')

如果您收到的文档返回的是这样的查询,那么他们的回答是正确的。

对于用户给出的每个答案,我会在每个用户的子集合中标记它,其中 quizId 是文档的 ID。因此,在用户 1 下,他们将有一个名为测验的集合。

当用户回答时,您可以将他们给出的答案推送到该用户的测验文档中的 map 。这可能看起来像这样:

-- user1
----- quizzes
-------- quiz1
----------- progress: 2/25
----------- complete: true
----------- score: 1/2
----------- answers
-------------- { questionId: question1, answer: xyz123, correct: true }
-------------- { questionId: question2, answer: rst456, correct: false }

对于您希望用户参加的每个测验,只要在 {userID}/quizzes} 中没有包含该 quizID 且 complete=true 的文档,他们就可以开始或继续参加,等等。

这比大多数人得到的要多,希望对您有所帮助。有些事情可能需要充实一点,其他人可能会有不同意见,但我喜欢这些练习。

关于google-cloud-firestore - Firestore - 什么是最适合我的场景的数据结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58241800/

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