Javascript 考虑组集合查询的firestore数据结构比较
我正在制作一个应用程序,可以在阅读书籍时提问并获得答案,使用firestore收藏:书籍和用户。对于每个图书文档,都有一个问题子集合:books/isbn/questions/{questionid}。对于自动生成的每个questionid,都有一些属性,包括询问问题的用户的用户id asker_uid 现在,对于一个特定的用户,如果我想列出他问的所有问题。我可以进行组集合查询: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('
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一起显示,但在其外部变得未定义)
总的来说,我认为这与前面的问题有些关联:
非常感谢您的意见/建议!我认为对数据进行去建模的方法更好。因为
- 它将使您的数据结构具有可伸缩性,如果您使用嵌套的方法来构造数据,您将面临更多类似的情况