Google cloud firestore 在Firestore上实现多对多关系

Google cloud firestore 在Firestore上实现多对多关系,google-cloud-firestore,many-to-many,Google Cloud Firestore,Many To Many,我需要在Firestore上建立多对多关系模型。下面是对这些要求的总结 一家公司可以为一个项目雇用许多承包商。承包商可以在不同的时间为多家公司的不同项目工作 承包商或公司的数量不应受到限制,即应使用集合或子集合 承包商应能够按公司进行查询;反之亦然,公司应该能够通过承包商进行查询。例如,(1)承包商可能要求提供他/她工作过的公司列表,按项目和时间排序;(2)公司可以要求提供所有在一个月内为其工作的承包商,按项目和承包商排序,可能按周划分 就公司而言,承包商可以改变状态,例如工作、完成。公司

我需要在Firestore上建立多对多关系模型。下面是对这些要求的总结

  • 一家公司可以为一个项目雇用许多承包商。承包商可以在不同的时间为多家公司的不同项目工作

  • 承包商或公司的数量不应受到限制,即应使用集合或子集合

  • 承包商应能够按公司进行查询;反之亦然,公司应该能够通过承包商进行查询。例如,(1)承包商可能要求提供他/她工作过的公司列表,按项目和时间排序;(2)公司可以要求提供所有在一个月内为其工作的承包商,按项目和承包商排序,可能按周划分

  • 就公司而言,承包商可以改变状态,例如工作、完成。公司在项目生命周期内改变承包商的状态。此状态可用于查询

  • 显然,承包商不应接触其他承包商的信息

  • 在移动应用程序上,公司仅由一个用户代表。类似地,承包商在移动应用程序上仅由一个用户表示

  • 移动应用程序内置React Native,据我所知,Firestore将其视为web应用程序

  • 我正在考虑为每家公司/在每家公司下使用文件的子集合每个文档代表一个项目。所有承包商的姓名、状态以及开始和结束时间都存储在此文档中

    同时,为每个承包商提供项目文件的副本子集合这些重复文件中的每一份都代表项目文件(如上)的部分副本。此重复文档存储公司名称以及项目的开始和结束时间

    a。无论何时建立关系,例如签订合同,都会批量创建两个文档

    b。状态仅存在于文档的第一份副本上

    c。如果对几乎静态的数据(如姓名、电话)进行任何罕见的更改,则两个文档都会更新

    这个设计有意义吗? 有什么顾虑、建议和更好的想法吗? 如果你同意这个设计,我很想听听你的意见,也许你可以在评论中写一些听起来不错的东西


    AskFirebase在某些特定情况下,您可以使用子集合,也可以不使用子集合

    何时使用子集合:

    1) 当您不想在文档中存储大量字段时。CloudFireStore有20000个字段限制。(如果公司和承包商信息非常庞大,可能超过20000个字段)

    2) 更新父集合是一项常见操作时。Firestore仅允许您以每秒1次写入的速率更新文档。(如果公司和承包商信息经常被修改)

    3) 当您要限制对文档特定字段的访问时。(如果要限制对公司承包商的访问,或者应该限制对承包商公司的访问。在这种情况下,将受限制的字段移动到另一个集合中的另一个文档也是一个好主意!)

    不使用子集合时:

    1) 当您希望同时查询集合和子集合时。Firestore查询很肤浅。因此,在查询父集合时不会查询子集合,因此必须单独查询它们。(如果您有一个案例可以在一个窗口中显示所有公司及其承包商)

    2) 当您在查看集合时希望显示子集合时。(当显示公司时,您可能希望显示其承包商。此处的读取次数将增加,因为不是读取一个文档,而是始终读取一个文档及其子集合)

    3) 当您希望同时查询托收和子托收时。(当您希望查询跨公司和承包商的常见事项(如工作领域或最低费率)时,可以使用新发布的托收组查询)

    4) 如果您正在考虑查询单个数据段,则应将它们放入集合中。(如果公司通常查询承包商的特定属性,或多个承包商查看公司的详细信息)

    我的建议:

    Company
    用于存储公司信息的集合,可以根据公司的质量对公司进行搜索

    Contractors
    使用相同的方法收集,因为我假设将根据其属性大量查询承包商

    项目
    有关公司和承包商将合作的项目信息的子集合。如果只有一家公司正在处理一个项目,则这可以是“公司”集合下的子集合。即使多个承包商将为一家公司处理一个项目,您也可以将承包商的ID存储在项目集合中的数组中。这将帮助您避免每个
    公司
    /
    承包商
    集合中的项目部分子集合

    但是,如果需要查询项目的质量,最好将它们作为单独的父集合公开。我让你来决定

    最后,我建议使用一个新的集合
    合同
    ,该集合可用于存储
    公司
    承包商
    项目
    之间的关系,以及您可以进行复杂查询的所有信息。如果同一家公司和承包商有两个不同的项目,他们正在工作/合作,那么它可以是
    合同
    集合中的两个文档。当您想要显示一些仪表板时,这很方便。使用这个单一的公司