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

时间:2017-01-25 21:30:36

标签: javascript firebase firebase-realtime-database angularfire2 nosql

我读了这个问题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的例子会很酷
感谢

AskFirebase

1 个答案:

答案 0 :(得分:2)

使用NoSQL,您必须首先考虑视图,然后让视图决定您的架构。你绝对可以用一个查询来做这个,但忘记规范化,这个概念只适用于关系数据库。

假设您有一个视图,您希望按公司搜索并列出所有承包商,他们的信息,或由承包商搜索并列出所有公司的信息:

架构: companyContractorKey,contractorCompanykey,contractorName,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支持使用一个请求更新多个记录,因此这不会出现问题。

此外,您还希望避免在该架构节点中输入有关公司或承包商的所有信息,仅包含视图所需的信息,并将所有不在“列表”视图中的详细信息放在单独的架构节点中一个致力于公司,一个致力于承包商。