firebase - Firebase 中的多对多关系

标签 firebase firebase-realtime-database angularfire2 nosql

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

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

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

最佳答案

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

  • 承包商
  • 公司
  • 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 .

关于firebase - Firebase 中的多对多关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41527058/

相关文章:

firebase - 注销错误 Cloud Firestore。调用者无权执行指定操作

android - FirebaseUI 3.1.2 与 firebase auth/firestore 11.8.0 的依赖关系问题

javascript - 如何在 firebase set() 中返回 promise

没有 'new' 无法调用 AngularFire 身份验证持久性

firebase - Firebase 控制台中的实时数据库未加载数据

java - 如何从所有用户的 FirebaseRecyclerAdapter 中隐藏当前用户?

javascript - 带有 Observables 的 AngularFire2 没有捕获 $ref 属性

java - 如何从 firebase 实时数据库检索列表?

javascript - 链接管道操作后如何从 Angular 服务中返回可观察值

Angular AuthGuard - 按顺序检查身份验证和数据库条目