当我们有多对多关系时,如何在 firebase 中获取数据

Lim*_*nis 5 javascript nosql firebase firebase-realtime-database angularfire2

我阅读了 Firebase 中的多对多关系问题,
这里描述了如何在 firebase(nosql 数据库)中创建或构建多对多关系,这很容易,

companyContractors
  companyKey1
    contractorKey1: true
    contractorKey3: true
  companyKey2
    contractorKey2: true
contractorCompanies
  contractorKey1
    companyKey1: true,
    companyKey2: true
  contractorKey2
    companyKey2: true
  contractorKey3
    companyKey1: true
Run Code Online (Sandbox Code Playgroud)

但是当我想获得所有承包商的特定公司时,我可以只使用一个请求吗?因为在这种情况下,我只得到 id 列表,在那里之后,使用 js 循环或 forEach,我做了多个请求。

通常在其他 API 上,我只使用

URL/contractor/:id/company or 
URL/company/:id/contractors 
Run Code Online (Sandbox Code Playgroud)

如何在firebase上做到这一点?
有一个使用angular2,angularfire2的例子会很酷,
谢谢

AskFirebase

Ton*_*him 3

使用 NoSQL,您必须首先考虑视图,然后让视图决定您的架构。您绝对可以通过一个查询来完成此操作,但忘记规范化,该概念仅适用于关系数据库。

假设您有一个视图,您希望按公司搜索并列出所有承包商及其信息,或者按承包商搜索并列出所有公司及其信息:

架构:companyContractorKey、contractorCompanykey、c​​ontractorName、contractorSkill、companyIndustry 等...

其中,companyContractorKey 是包含公司名称和承包商名称串联的字段,例如:“Acme/Ellis Electric”。然后,您可以进行从“Acme/A”到“Acme/z”的范围搜索,并获取 Acme 的所有承包商。

同样,contractorCompanyKey 是一个包含承包商名称和公司串联的字段,例如“Ellis Electric/Acme”。然后,您可以进行从“Ellis Electric/A”到“Ellis Electric/z”的范围搜索,以获取 Ellis Electric 的所有公司。

缺点是公司的信息存储在多条记录中(使用companyContractorKey很容易找到),承包商的信息也存储在多条记录中(使用contractorCompanyKey找到),所以更新和删除会涉及多条记录,但是查询会超级快,只要你在两个关键字段上建立索引。Firebase 支持通过一个请求更新多条记录,因此这应该不会出现问题。

此外,您还希望避免在该模式节点中放入有关公司或承包商的所有信息,而仅将您的视图所需的信息放入其中,并将不在“列表”视图中的所有详细信息放在单独的模式节点(一个专用的模式节点)中。一个是公司,一个是承包商。