Firebase 如何确定NoSQL数据结构(更多或更少的集合)

Firebase 如何确定NoSQL数据结构(更多或更少的集合),firebase,google-cloud-firestore,nosql,Firebase,Google Cloud Firestore,Nosql,我正在与firebase firestore合作创建一个原型web应用程序。我的目标是有两个不同的视图,未处理和正在处理。用户将与站点相关联,当他们登录时,他们将只看到与其站点相关联的详细信息。方法1,创建以下集合: 地点 站点1已处理 站点1未处理 Site2已处理 站点2未处理 当有人从未处理的Site1中选取详细信息时,它会将其移动到Site1已处理 第二种方法是最小化集合并使用文档属性,从而生成以下集合: 地点 细节 每个详细信息文档都有一个名为site and status的属

我正在与firebase firestore合作创建一个原型web应用程序。我的目标是有两个不同的视图,未处理和正在处理。用户将与站点相关联,当他们登录时,他们将只看到与其站点相关联的详细信息。方法1,创建以下集合:

  • 地点
  • 站点1已处理
  • 站点1未处理
  • Site2已处理
  • 站点2未处理
当有人从未处理的Site1中选取详细信息时,它会将其移动到Site1已处理

第二种方法是最小化集合并使用文档属性,从而生成以下集合:

  • 地点
  • 细节
每个详细信息文档都有一个名为site and status的属性

当文档的状态从未处理更改为正在处理时,它将从未处理视图中删除。当文档的状态从“处理”更改为“完成”时,它将不会加载到任何视图中,而是由报表访问。在未处理视图中,详细信息上的其他属性也将实时更新


哪些因素会影响这些结构中哪一个更合适?

我选择使用两个集合,因为查询的功能远比我在提问时理解的强大

我使用此代码获取详细信息:

this.unprocessed =  this.firestore.getDetails(this.selectedSite.Name, 'Unprocessed').onSnapshot((snapshot) => {
  snapshot.docChanges().forEach(change => {
    switch (change.type) {
      case 'added':
        this.unprocessedDetails.push(Object.assign(change.doc.data(), { id: change.doc.id }));
        break;
      case 'modified':
        this.updateDetail(this.unprocessedDetails, change.doc.data(), change.doc.id);
        break;
      case 'removed':
        this.unprocessedDetails = this.unprocessedDetails.filter(x => x.id !== change.doc.id);
    }
  });
});
如果更新了详细信息且状态不再为未处理状态,则会触发docChanges并删除该详细信息。如果文档的详细编号发生更改,则会触发docChanges并更新详细信息


以这种方式组织的优点是,更容易找到您要查找的内容(无需搜索多个集合)。

我选择使用两个集合,因为查询的功能远远超过我在提问时理解的功能

我使用此代码获取详细信息:

this.unprocessed =  this.firestore.getDetails(this.selectedSite.Name, 'Unprocessed').onSnapshot((snapshot) => {
  snapshot.docChanges().forEach(change => {
    switch (change.type) {
      case 'added':
        this.unprocessedDetails.push(Object.assign(change.doc.data(), { id: change.doc.id }));
        break;
      case 'modified':
        this.updateDetail(this.unprocessedDetails, change.doc.data(), change.doc.id);
        break;
      case 'removed':
        this.unprocessedDetails = this.unprocessedDetails.filter(x => x.id !== change.doc.id);
    }
  });
});
如果更新了详细信息且状态不再为未处理状态,则会触发docChanges并删除该详细信息。如果文档的详细编号发生更改,则会触发docChanges并更新详细信息


以这种方式组织的好处是更容易找到您想要的内容(无需搜索多个收藏)。

这听起来像是我的偏好,除非您能够提出进一步的用例,从而无法使用其中一个或另一个选项。我们真的无法为您提供这些用例。NoSQL数据建模的底线是,您的建模应该支持您打算执行的查询。有时,为了支持所有必需的查询,您会复制数据库中的数据。这听起来像是我的偏好,除非您能够提出进一步的用例,从而无法使用其中一个选项。我们真的无法为您提供这些用例。NoSQL数据建模的底线是,您的建模应该支持您打算执行的查询。有时,为了支持所有必需的查询,您会复制数据库中的数据。