【问题标题】:how to get data within firebase, when we have many to many relationship当我们有多对多关系时,如何在firebase中获取数据
【发布时间】:2017-01-25 21:30:35
【问题描述】:

我读到了这个问题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

【问题讨论】:

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


【解决方案1】:

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

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

架构: companyContractorKey,contractorCompanykey,contractorName,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 支持通过一个请求更新多条记录,因此这应该不会造成问题。

此外,您还需要避免将有关公司或承包商的所有信息放入该架构节点中,仅将您的视图所需的信息放入单独的架构节点中,并将“列表”视图中未包含的所有详细信息,一种专用于公司,另一种专用于承包商。

【讨论】:

  • 我将 /A 和 /z 显示为范围开始和结束以澄清,但在实际应用程序中,我使用 / 和 /ASCII 255
  • 加载单个项目并不像您想象的那么慢,因为 Firebase 会通过管道传输请求。在这里查看我的答案:stackoverflow.com/questions/35931526/….
  • 也就是说,我个人非常喜欢复制(部分)实际数据以摆脱联接。但这主要是出于代码清晰的原因,而不是出于性能考虑。我们说,使用 Firebase,您最终会在数据库中对“视图模型”进行建模,这与您开始使用的类似。所以我们在大多数方面都同意,只是我对链接问题的回答是错误的。 :-)
  • 我不熟悉流水线请求。我熟悉并行请求,如链接的帖子中所示,但在这种情况下,我认为您将达到对一个 URL 的最大并发请求的浏览器限制,因此您一次可能会收到 8 或 16 个并行请求,具体取决于浏览器.因此,对于返回 64 个项目的查询,您最终会得到第一个请求的 1 次往返,并且每个套接字上相当于 8 次往返,总共 9 次往返(这可以解释良好连接上的 600 毫秒延迟) )。在移动设备上,它不会很好......现在使用 HTTP/2.0,它会更好。
  • 这是一个单一的连接,所以没有最大值。它使用 Web 套接字,因此没有 HTTP 开销(除了最初的第一个连接请求之外)。我链接的帖子,因为它解释了它是如何工作的。它还包含一个指向 jsbin 的链接,您可以使用它来测试它。
猜你喜欢
  • 2019-01-03
  • 1970-01-01
  • 1970-01-01
  • 2019-05-11
  • 1970-01-01
  • 2015-04-05
  • 1970-01-01
相关资源
最近更新 更多