当前位置: 首页 > 知识库问答 >
问题:

在Firestore上实现多对多关系

索锐藻
2023-03-14

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

>

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

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

    承包商应能够按公司进行查询;反之亦然,公司应该能够通过承包商进行查询。例如,(1)承包商可能要求提供他/她工作过的公司的清单,并按项目排序

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

    显然,承包商不应该获得其他承包商的信息。

    移动应用上只有一个用户代表一家公司。类似地,承包商在移动应用上仅由单个用户表示。

    这款手机应用内置React Native,据我所知,Firestore将其视为一款网络应用。

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

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

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

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

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

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

  • 共有1个答案

    汪胡非
    2023-03-14

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

    何时使用子集合:

    1)当您不想在文档中存储大量字段时。云火力有20,000个字段限制。(如果公司和承包商的信息非常巨大,可以超过20,000个字段)

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

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

    不使用子集合时:

    1)当要一起查询集合和子集合时。萤火虫查询是肤浅的。因此,当您查询父集合时,不会查询子集合,因此您必须单独查询它们。(如果您有一个案例,在一个窗口中显示所有公司及其承包商)

    2) 当您想在查看集合时显示子集合时。(在展示一家公司时,你可能想展示它的承包商。在这里,阅读的次数会增加,因为你不是在阅读一份文件,而是一直在阅读一份文件及其子集合)

    3) 当您希望同时查询集合和子集合时。(只要你想查询公司和承包商之间常见的信息,比如工作领域或最低费率,你就可以使用最新公布的集合组查询)

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

    我的建议是:

    Companycollection,用于存储公司信息,可以根据公司的质量对其进行搜索。

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

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

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

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

    希望这有帮助。

     类似资料:
    • 问题内容: 我相信标题是不言而喻的。如何在PostgreSQL中创建表结构以建立多对多关系。 我的例子: 问题答案: SQL DDL(数据定义语言)语句如下所示: 我强烈建议您这样做,因为产品名称几乎不是唯一的(不是很好的“自然键”)。此外,强制使用唯一性并在外键中引用该列通常比使用存储为或的字符串便宜(4字节(甚至8字节))。 不要使用基本数据类型的名称作为 标识符 。尽管这是可能的,但这是不好

    • 问题内容: 我正在制作一个具有多对多关系的SQLite数据库,并使用以下代码将其分解为两个一对多的关系 错误: 有谁知道我该如何解决这个错误? 问题答案: 查看文档; 它向您表明,如果您在字段定义本身上指定了外键,则不应使用关键字本身。此外,正如 CL 指出的那样,您使用了太多逗号 。 ,即使单独指定约束,外键名称也不应放在括号中。 该语句可以满足您的要求: 还要注意,如果MODULEID是表MO

    • 最好的办法还是写一个真实的项目,从博客项目开始。 了解关系(1对1,1对多)在mongoose里如何实现 UserSchema = new Schema({ ... contacts:[] }); 了解关系(1对1,1对多,多对多)在mongoose里如何实现 ContactSchema = new Schema({ ... owner: { type

    • 我正在做一个小型的laravel项目来实现雄辩的关系,我主要有多个模型(项目、任务、用户、文件等) 一个项目可以分配多个用户,附加多个文件,也可以有多个任务。一个任务可以分配多个用户,也可以分配多个文件,以及多个其他东西。我已经谷歌和实施了hasManyPass,和归属许多关系,但我对关系感到困惑很多。有什么帮助吗? Project.php Task.php User.php 我得到的错误是,当我

    • 问题内容: 任何人都可以解释在设计带有示例的表时如何实现一对一,一对多和多对多关系吗? 问题答案: 一对一: 使用外键访问被引用的表: 您还必须在外键列()上设置唯一约束,以防止子表()中的多行与引用表()中的同一行相关。 一对多 :在关系的许多方面使用外键链接回“一个”侧: 多对多 :使用联结表(例如): 查询示例:

    • 问题内容: 伙计们,我正在努力为我的公司制作一个简单的票证生成系统,以吸引人。目前,我的MSSQL数据库中有一个名为的表,另一个名为的表。 我的应用程序是C#Windows窗体,因此在新的票证生成窗体上,我有许多文本框和一个用于分配工程师的comboBox,由填充。生成票证后,以这种形式输入的所有信息都将与from一起存储。 效果很好,但是后来我的客户要求我添加选项,以便可以在一张票上分配3名工程