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

2024-05-17

我读了这个问题Firebase 中的多对多关系 https://stackoverflow.com/questions/41527058/many-to-many-relationship-in-firebase,
这里描述了如何在 firebase(nosql 数据库)中创建或构造多对多关系, 这很容易,

companyContractors
  companyKey1
    contractorKey1: true
    contractorKey3: true
  companyKey2
    contractorKey2: true
contractorCompanies
  contractorKey1
    companyKey1: true,
    companyKey2: true
  contractorKey2
    companyKey2: true
  contractorKey3
    companyKey1: true

但是,当我想要获取所有承包商的特定公司时,我可以仅使用一个请求来完成吗?因为在这种情况下我只得到 id 列表,然后使用 js 循环或 forEach,我执行多个请求。

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

URL/contractor/:id/company or 
URL/company/:id/contractors 

如何在 firebase 上做到这一点?
如果有一个使用 Angular2、AngularFire2 的例子会很酷
thanks

询问 Firebase


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

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

架构: 公司ContractorKey、contractorCompanykey、c​​ontractorName、contractorSkill、 公司行业等...

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

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

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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