Firebase 中的多对多关系

问题描述 投票:0回答:3

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

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

在 firebase 中构建数据的替代方案有哪些?

firebase firebase-realtime-database angularfire2 nosql
3个回答
38
投票

自我回答确实是建模的一种方式。这可能是最直接相当于在关系数据库中建模的方式:

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

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

  • 承包商
  • 公司
  • 公司承包商
  • 承包商公司

最后两个节点看起来像:

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

这种双向结构允许您查找“公司的承包商”和“承包商的公司”,而无需进行查询。这肯定会更快,特别是当您添加承包商和公司时。

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

推荐阅读 NoSQL 数据建模 并查看 面向 SQL 开发人员的 Firebase。这个问题也在#AskFirebase youtube 系列的剧集中出现过。

更新(2017016)

有人发布了一个

后续问题链接到这里关于从“承包商”和“公司”节点检索实际项目。您需要一次检索这些,因为 Firebase 没有相当于 SELECT * FROM table WHERE id IN (1,2,3)

 的功能。但此操作并不像您想象的那么慢,因为请求是通过单个连接进行管道传输的。在这里阅读更多相关信息:
通过使用查询而不是重复观察单个事件来加速为我的社交网络应用程序获取帖子


9
投票
经过进一步研究,我将尝试回答我自己的问题。我已经审查了许多其他帖子,解决多对多问题的一种解决方案是在 Company 对象中存储 ContractorKeys 列表,并在每个承包商对象中存储 CompanyKeys 列表。下面用一个例子来说明这一点。

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。该列表的元素将代表单个承包商和公司之间的关系。其内容将是一对字段:contractorKey 和 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 查询 companyAndContractorsAssignment 来回答问题,以查找承包商的所有公司或公司的所有承包商。现在只需维护一个列表。我认为这是满足我的要求的最佳解决方案。


0
投票
在上面的解决方案代码中,为什么存储contractorKey1/companyKey1 ": true" ? 为什么要针对键存储布尔值?当然你有:-

承包商密钥; “

” 公司密钥 ; “

那么...在文档数据库中建立多对多关系模型的最新共识最佳方法是什么?是 4 节点解决方案还是“链接表”(3 节点)解决方案?

© www.soinside.com 2019 - 2024. All rights reserved.