当前位置: 首页 > 知识库问答 >
问题:

Firebase中的多对多关系

越新霁
2023-03-14

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

  1. 给定一家公司,谁是当前的承包商
  2. 给定一个承包商,他们为哪些公司工作

在firebase中构建数据的替代方案是什么?

共有2个答案

宫高义
2023-03-14

在进一步研究之后,我将尝试回答我自己的问题。我已经阅读了许多其他帖子,解决多对多问题的一个方法是在一个公司对象中存储一个ContractWorkey列表,并在每个contractor对象中存储一个CompanyKey列表。下面的例子说明了这一点。

companies : {
  companyKey1 : {
    name : company1
    ...
    contractors : {
      contractorKey1 : true,   
      contractorKey3 : true
    }
  }
  companyKey2 : {
    name : company2
    ...
    contractors : {
      contractorKey2 : true,  
    } 
  }
}
contrators : {
  contractorKey1 : {
     name : bill
     ...
     companies : {
        companyKey1 : true
     }
   }
  contractorKey2 : {
     name : steve
     ...
     companies : {
        companyKey1 : true
     }

   }
  contractorKey3 : {
     name : jim
     ...
     companies : {
        companyKey2 : true
     }
   }
}

这个组织“运作”的意义在于上述问题可以得到回答。但这种解决方案的一个缺点是,当承包商/公司的任务发生变化时,需要维护两个列表。如果有一种方法可以在单个列表中表示这些信息,那就更好了。

我想我已经想出了一个更好的解决办法。解决方案是,除了名为companyAndContractorAssignment的公司和承包商之外,创建第三个列表。本清单的要素将代表单个承包商和公司之间的关系。它的内容将是一对字段,ContractWorkey和companyKey。然后,我们可以删除公司内的承包商名单和承包商内的公司名单。这种替代结构如下所示。请注意,公司对象中没有承包商列表,也没有包含承包商对象的公司列表。

companies : {
  companyKey1 : {
    name : company1
    ...
  }
  companyKey2 : {
    name : company2
    ...
  }
}
contrators : {
  contractorKey1 : {
     name : bill
     ...
  }
  contractorKey2 : {
     name : steve
     ...
  }
  contractorKey3 : {
     name : jim
     ...
  }
}
companyAndContractorsAssignment : {
  key1 : {
    contractorKey1 : true,
    companyKey1: true,
  }
  key2 : {
    contractorKey3 : true,
    companyKey1: true,
  }
  key3 : {
    contractorKey2 : true,
    companyKey2: true,
  }

这种替代结构允许您使用orderByChild/equalTo查询公司和承包商分配来回答问题,以查找承包商的所有公司或公司的所有承包商。现在只有一个列表需要维护。我认为这是对我的要求最好的解决方案。

裴欣然
2023-03-14

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

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

另一种选择是使用4个顶级节点:

  • 承包商

最后两个节点看起来像:

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

这种双向结构允许您同时查找“公司的承包商”和“承包商的公司”,而无需查询任何一个。这肯定会更快,尤其是当你加入承包商和公司时。

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

SQL开发人员推荐阅读非关系型数据库数据建模和查看Firebase。这个问题也出现在#AskFirebase youtube系列的一集里。

有人发布了一个后续问题,链接到这里,是关于从“承包商”和“公司”节点检索实际项目的。您将需要一次检索一个,因为Firebase没有一个与(1,2,3)中id所在的表中的SELECT*FROM等同的代码。但是这个操作并不像你想象的那么慢,因为请求是通过单个连接进行管道传输的。在这里了解更多信息:通过使用查询,而不是反复观察单个事件,来加速获取我的社交网络应用程序的帖子。

 类似资料:
  • 问题内容: 我有一个Firebase数据库。我有公司和承包商。一个承包商可以为多个公司工作,而一个公司可以有多个承包商。这是直接的多对多关系。我希望能够回答有关公司和承包商的问题: 给定一家公司,他们是当前的承包商。 给承包商一个他们要工作的公司。 在Firebase中构造数据的替代方法有哪些? 问题答案: 自我回答确实是对此进行建模的一种方法。它可能是在关系数据库中建模的最直接等效方法: 承办商

  • 问题内容: 我知道在Elasticsearch中,我们可以在文档之间建立子/父关系。 然后,在建立索引时,我可以传递父代ID,以便将子文档和父文档链接起来: 无论如何,在Elasticsearch中建立多对多关系的模型吗? 数据驻留在具有以下架构的MySQL数据库中: 当前这是我的映射(请原谅数组表示法,我在PHP中使用Elastica与我的Elasticsearch服务器通信): 这种方法的问题

  • 如何以多对多关系从Firebase Cloud Firestore构建和查询数据? 我有公司和承包商。一个承包商可以为多个公司工作,一个公司可以有多个承包商。这是一种简单的多对多关系。我希望能够回答有关公司和承包商的问题: 给定一家公司,谁是目前的承包商。给承包商他们在为什么公司工作。什么是正确的方式来构建Cloud Firesta中的数据?

  • 我还想知道如何定义每个模型上的关系--你是否需要或者是否可以只在用户上定义关系?

  • 问题内容: 伙计们,我正在努力为我的公司制作一个简单的票证生成系统,以吸引人。目前,我的MSSQL数据库中有一个名为的表,另一个名为的表。 我的应用程序是C#Windows窗体,因此在新的票证生成窗体上,我有许多文本框和一个用于分配工程师的comboBox,由填充。生成票证后,以这种形式输入的所有信息都将与from一起存储。 效果很好,但是后来我的客户要求我添加选项,以便可以在一张票上分配3名工程