Angular 4 Firebase - Cloud Firestore'深度嵌套'与'Flatten'

时间:2017-11-08 18:32:19

标签: angular firebase firebase-realtime-database angularfire2 google-cloud-firestore

很好奇如何使用“Cloud Firestore(beta)”数据库构建以下内容

收藏集/实体='菜单','页面','','栏目' ,'项目'

菜单有很多页面页面有许多有许多部分部分有许多。 在构建这个......时,我是否正确?

  • 页面 doc menuId
  • doc有 pageId
  • 栏目 doc columnId
  • 商品 doc sectionId

因此,例如,我将使用..

检索所有菜单页面
this.afs.collection('pages', ref => ref.where('menuId', '==', menuId));

包含..

的所有页面列
this.afs.collection('columns', ref => ref.where('pageId', '==', pageId));

或者我应该将其构建为子集合?

1 个答案:

答案 0 :(得分:4)

在NoSQL中,您的第一个问题始终是“如何从我的应用程序中查询此数据?”。您有一系列一对多关系(即页面到列),这导致两种主要模式。

  1. 层次结构(父子)。如果始终通过父文档查询列,则嵌套子集合。然后,只要您引用父文档pageRef.collection('columns'),就可以抓取该集合。

  2. 非规范化(兄弟姐妹)。但是,如果您需要跨多个页面查询列,该怎么办?在这种情况下,您可能希望使用根或更高级别的集合,将引用或id保存到它的兄弟级页面。然后,您可以进行afs.collection('columns', ref => ref.where('color', '==', 'orange'))之类的查询,从而允许您在不递归数据库树的情况下查询列以查找所有子集合。