Angular 4 Firebase - Cloud Firestore 'Deeply Nested' 与 'Flatten'

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

想知道如何使用“Cloud Firestore(测试版)”数据库构建以下内容

集合/实体 = '菜单'、'页面'、''、'部分' , '项目'

菜单有很多页面Page 有很多ColumnsColumn 有很多Sections部分 有许多项目。 我在构建这个地方时是否正确......

  • 页面 文档有 menuId
  • Column 文档有 pageId
  • Section 文档有 columnId
  • Item 文档有 sectionId

例如,我将检索所有菜单页面......

this.afs.collection('pages', ref => ref.where('menuId', '==', menuId));

所有页面列...

this.afs.collection('columns', ref => ref.where('pageId', '==', pageId));

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

最佳答案

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

  1. 层次结构(父子关系)。如果总是通过父文档查询列,请嵌套一个子集合。然后,您可以在引用父文档pageRef.collection('columns') 时随时获取该集合。

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

关于Angular 4 Firebase - Cloud Firestore 'Deeply Nested' 与 'Flatten',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47187161/

相关文章:

ios - 将数据从 Firestore 映射到 Swift 中的结构 - IOS

ios - 在 FirebaseDatabase - Swift IOS 中使用循环保存多个数据

Angular Material 2 MatMenu - 动态创建

express - 获取 Angular 2 通用启动器以部署到外部服务器主机(谷歌云、Azure 等)的步骤?

android - 旧设备问题上的 google play 服务和 firebase 应用程序

android - Firebase android如何一次从键列表中获取数据

android - 如何用 firebase 实时数据库中的新字段更新子项?

Angular 5 PWA 未在离线模式下加载

angular - 在 Angular2 下使用 Typescript 进行 Sequelize

javascript - 如何显示包含来自具有相同地理点的 firestore 集合中所有文档的数据的 googlemaps 标记