热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Firebase中的多对多关系

如何解决《Firebase中的多对多关系》经验,为你挑选了2个好方法。

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

    鉴于一家公司,谁是现有的承包商.

    鉴于承包商他们为公司工作的是什么.

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



1> Frank van Pu..:

自我答案确实是对此进行建模的一种方式.它可能是你在关系数据库中如何建模的最直接的等价物:

承包商

公司

companyAndContractorsAssignment(多对多连接器表)

另一种方法是使用4个顶级节点:

承包商

公司

companyContractors

contractorCompanies

最后两个节点看起来像:

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

这种双向结构允许您查找"公司的承包商"和"承包商的公司",而这些都不需要查询.这必然会更快,特别是在您添加承包商和公司时.

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

推荐阅读NoSQL数据建模和查看Firebase for SQL开发人员.这个问题也出现在#AskFirebase youtube系列的一集中.

更新(2017016)

有人发布了一个后续问题,该问题链接到这里从"承包商"和"公司"节点检索实际项目.您需要一次检索一个,因为Firebase没有等效的SELECT * FROM table WHERE id IN (1,2,3).但是这个操作并不像你想象的那么慢,因为请求是通过单个连接进行流水线操作的.在此处阅读更多相关信息:通过使用查询而不是反复观察单个事件,加快为我的社交网络应用程序提取帖子.


有没有什么方法可以使用.validation或.write规则来验证这些值。...即,承包商不应包含不存在的companyKey。

2> Rob Gorman..:

经过进一步的研究,我将尝试回答我自己的问题.我已经审查了许多其他帖子,并且对多对多问题的解决方案是在公司对象中存储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的公司和承包商.此列表的元素将代表单个承包商与公司之间的关系.它的内容将是一对领域,承包商密钥和公司密钥.然后我们可以取消公司内的承包商名单和承包商内的公司名单.该替代结构如下所示.请注意,公司对象中没有承包商列表,也没有公司列出承包商对象.

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,
  }

这种替代结构允许人们使用companyAndContractorsAssignment上的orderByChild/equalTo查询来回答问题,以找到承包商的所有公司或公司的所有承包商.现在只有一个列表需要维护.我认为这是满足我要求的最佳解决方案.


我想如果你这样做,你可能会在索引方面遇到性能问题.Firebase会要求您在orderByChild上执行indexOn,但由于这些是动态密钥,因此可能会变成一个需要维护的噩梦.
推荐阅读
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • IhaveconfiguredanactionforaremotenotificationwhenitarrivestomyiOsapp.Iwanttwodiff ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 解决.net项目中未注册“microsoft.ACE.oledb.12.0”提供程序的方法
    在开发.net项目中,通过microsoft.ACE.oledb读取excel文件信息时,报错“未在本地计算机上注册“microsoft.ACE.oledb.12.0”提供程序”。本文提供了解决这个问题的方法,包括错误描述和代码示例。通过注册提供程序和修改连接字符串,可以成功读取excel文件信息。 ... [详细]
  • REVERT权限切换的操作步骤和注意事项
    本文介绍了在SQL Server中进行REVERT权限切换的操作步骤和注意事项。首先登录到SQL Server,其中包括一个具有很小权限的普通用户和一个系统管理员角色中的成员。然后通过添加Windows登录到SQL Server,并将其添加到AdventureWorks数据库中的用户列表中。最后通过REVERT命令切换权限。在操作过程中需要注意的是,确保登录名和数据库名的正确性,并遵循安全措施,以防止权限泄露和数据损坏。 ... [详细]
  • 我正在尝试将Firebase添加到涉及添加以下内容的现有应用程序中:classpath'com.googl ... [详细]
  • 加密、解密、揭秘
    谈PHP中信息加密技术同样是一道面试答错的问题,面试官问我非对称加密算法中有哪些经典的算法?当时我愣了一下,因为我把非对称加密与单项散列加 ... [详细]
  • nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd ... [详细]
  • 开发板:FL2440内核:linux3.0无线网卡:RT3070RT3070的工作模式分为STA(station)模式、SoftAP(AccessPoint)模式两种。STA ... [详细]
  • 数据库基本介绍
    1、数据库基本知识概念:数据库:database(DB),是一种存储数据的仓库数据库是根据数据结构组织、存储和 ... [详细]
  • 本文讨论了在数据库打开和关闭状态下,重新命名或移动数据文件和日志文件的情况。针对性能和维护原因,需要将数据库文件移动到不同的磁盘上或重新分配到新的磁盘上的情况,以及在操作系统级别移动或重命名数据文件但未在数据库层进行重命名导致报错的情况。通过三个方面进行讨论。 ... [详细]
  • 本文详细介绍了MySQL表分区的创建、增加和删除方法,包括查看分区数据量和全库数据量的方法。欢迎大家阅读并给予点评。 ... [详细]
  • 本文详细介绍了如何使用MySQL来显示SQL语句的执行时间,并通过MySQL Query Profiler获取CPU和内存使用量以及系统锁和表锁的时间。同时介绍了效能分析的三种方法:瓶颈分析、工作负载分析和基于比率的分析。 ... [详细]
  • MongoDB用户验证auth的权限设置及角色说明
    本文介绍了MongoDB用户验证auth的权限设置,包括readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase、cluster相关的权限以及root权限等角色的说明和使用方法。 ... [详细]
  • Windows7 64位系统安装PLSQL Developer的步骤和注意事项
    本文介绍了在Windows7 64位系统上安装PLSQL Developer的步骤和注意事项。首先下载并安装PLSQL Developer,注意不要安装在默认目录下。然后下载Windows 32位的oracle instant client,并解压到指定路径。最后,按照自己的喜好对解压后的文件进行命名和压缩。 ... [详细]
author-avatar
我心飞翔
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有