Javascript 考虑组集合查询的firestore数据结构比较

Javascript 考虑组集合查询的firestore数据结构比较,javascript,firebase,google-cloud-firestore,database-design,react-hooks,Javascript,Firebase,Google Cloud Firestore,Database Design,React Hooks,我正在制作一个应用程序,可以在阅读书籍时提问并获得答案,使用firestore收藏:书籍和用户。对于每个图书文档,都有一个问题子集合:books/isbn/questions/{questionid}。对于自动生成的每个questionid,都有一些属性,包括询问问题的用户的用户id asker_uid 现在,对于一个特定的用户,如果我想列出他问的所有问题。我可以进行组集合查询: firebase.firestore().collectionGroup('questions').where('

我正在制作一个应用程序,可以在阅读书籍时提问并获得答案,使用firestore收藏:书籍和用户。对于每个图书文档,都有一个问题子集合:books/isbn/questions/{questionid}。对于自动生成的每个questionid,都有一些属性,包括询问问题的用户的用户id asker_uid

现在,对于一个特定的用户,如果我想列出他问的所有问题。我可以进行组集合查询:

 firebase.firestore().collectionGroup('questions').where('asker_uid', '==', myUser.uid).get()
        .then((snapshot) =>
然后,如果我想在问题列表中显示提问书籍的详细信息,那么对于快照中的每个问题文档,我可以通过以下属性找到isbn:
doc.ref.parent.parent.id
。在找到isbn之后,我可以进行另一个查询,以显示该书的标题和作者等,这是该isbn的属性

firebase.firestore().collection('books').doc(doc.ref.parent.parent.id).get().then(
           (bookitem) =>
我的问题是,把书中的所有信息直接放在问题中是否更好?(该方法似乎被称为反规范化),这样,在组集合查询之后,我可以直接获得每个问题快照所需的所有信息(例如书名)。缺点是我需要把每个问题的额外数据放在一本书中。一本书中可能有很多问题

另一种方法是,正如我在上面的代码块中所描述的,对于每个问题,我都会追溯到祖父母id,然后再进行另一次查询以获取书籍的信息。pro节省了存储空间,而且感觉很干净。缺点是还有额外的查询,目前我仍在思考如何在我的react本机代码中的useEffect钩子中嵌套查询(首先是集合组查询,然后为每个快照执行另一个isbn查询)(book title属性可以在第二个查询的代码块内与console.log一起显示,但在其外部变得未定义)

总的来说,我认为这与前面的问题有些关联:


非常感谢您的意见/建议!

我认为对数据进行去建模的方法更好。因为

  • 它将使您的数据结构具有可伸缩性,如果您使用嵌套的方法来构造数据,您将面临更多类似的情况

谢谢你的意见!我想知道是否有人有过做出此类决策的经验。虽然反规范化似乎更容易,但它会导致大量重复数据,我不知道firestore中是否有工具/程序来确保在需要更改时同步重复数据。该方法去规范化是减少重复数据的一种方法。这就是关系SQL用来减少重复数据的方法。你有没有任何去规范化会导致数据重复的案例?你可能是把去规范化的概念弄错了!请检查一下我在帖子中提到的链接