首页 > 解决方案 > Firestore - 我的场景的最佳数据结构是什么?

问题描述

我正在为我的应用程序寻找最佳架构而苦苦挣扎。我应该使用顶级集合、子集合、数组等吗?

设置:

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

要求:

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

任何帮助表示赞赏。

标签: google-cloud-firestore

解决方案


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

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

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

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

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

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

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

这些问题会伴随着他们的潜在答案,我认为每个人都应该有自己的身份。像这样:

-- 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。所以在 user1 下,他们会有一个名为 quizzes 的集合。

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

-- 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,他们就可以开始测验,或继续参加测验,等等。

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


推荐阅读