我有一个Firebase数据库。我有公司和承包商。一个承包商可以为多个公司工作,而一个公司可以有多个承包商。这是直接的多对多关系。我希望能够回答有关公司和承包商的问题:

  • 给定一家公司,他们是当前的承包商。
  • 给承包商一个他们要工作的公司。

  • 在Firebase中构造数据的替代方法有哪些?

    最佳答案

    自我回答确实是对此进行建模的一种方法。它可能是在关系数据库中建模的最直接等效方法:

  • 承包商
  • 公司
  • companyAndContractorsAssignment(多对多连接器表)

  • 一种替代方法是使用4个顶级节点:
  • 承包商
  • 公司
  • 公司承包商
  • 承包商公司

  • 最后两个节点如下所示:
    companyContractors
        companyKey1
            contractorKey1: true
            contractorKey3: true
        companyKey2
            contractorKey2: true
    contractorCompanies
        contractorKey1
            companyKey1: true
        contractorKey2
            companyKey2: true
        contractorKey3
            companyKey1: true
    

    这种双向结构使您既可以查找“公司承包商”又可以“公司承包商”,而无需查询。这势必会更快,尤其是在您添加承包商和公司时。

    这对于您的应用程序是否必要,取决于您需要的用例,您期望的数据大小等等。

    建议阅读NoSQL data modeling并查看Firebase for SQL developers。这个问题也出现在episode of the #AskFirebase youtube series中。

    更新(2017016)

    有人张贴了follow-up question that links here关于从“承包商”和“公司”节点中检索实际项目的信息。您将需要一次检索一个,因为Firebase没有与SELECT * FROM table WHERE id IN (1,2,3)等效的对象。但是此操作并不像您想象的那样慢,因为请求是通过单个连接进行流水线处理的。在这里阅读更多有关此信息:Speed up fetching posts for my social network app by using query instead of observing a single event repeatedly

    07-24 09:45
    查看更多