我有一个Firebase数据库。我有公司和承包商。一个承包商可以为多个公司工作,一个公司可以有多个承包商。这是一种简单的多对多关系。我希望能够回答有关公司和承包商的问题:
在firebase中构建数据的替代方案是什么?
在进一步研究之后,我将尝试回答我自己的问题。我已经阅读了许多其他帖子,解决多对多问题的一个方法是在一个公司对象中存储一个ContractWorkey列表,并在每个contractor对象中存储一个CompanyKey列表。下面的例子说明了这一点。
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的公司和承包商之外,创建第三个列表。本清单的要素将代表单个承包商和公司之间的关系。它的内容将是一对字段,ContractWorkey和companyKey。然后,我们可以删除公司内的承包商名单和承包商内的公司名单。这种替代结构如下所示。请注意,公司对象中没有承包商列表,也没有包含承包商对象的公司列表。
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,
}
这种替代结构允许您使用orderByChild/equalTo查询公司和承包商分配来回答问题,以查找承包商的所有公司或公司的所有承包商。现在只有一个列表需要维护。我认为这是对我的要求最好的解决方案。
自我回答确实是建模的一种方式。这可能是在关系数据库中对此进行建模的最直接的等效方法:
另一种选择是使用4个顶级节点:
最后两个节点看起来像:
companyContractors
companyKey1
contractorKey1: true
contractorKey3: true
companyKey2
contractorKey2: true
contractorCompanies
contractorKey1
companyKey1: true
contractorKey2
companyKey2: true
contractorKey3
companyKey1: true
这种双向结构允许您同时查找“公司的承包商”和“承包商的公司”,而无需查询任何一个。这肯定会更快,尤其是当你加入承包商和公司时。
这是否对你的应用程序是必要的,取决于你需要的用例、你期望的数据大小等等。
SQL开发人员推荐阅读非关系型数据库数据建模和查看Firebase。这个问题也出现在#AskFirebase youtube系列的一集里。
有人发布了一个后续问题,链接到这里,是关于从“承包商”和“公司”节点检索实际项目的。您将需要一次检索一个,因为Firebase没有一个与(1,2,3)中id所在的表中的SELECT*FROM等同的代码。但是这个操作并不像你想象的那么慢,因为请求是通过单个连接进行管道传输的。在这里了解更多信息:通过使用查询,而不是反复观察单个事件,来加速获取我的社交网络应用程序的帖子。
问题内容: 我有一个Firebase数据库。我有公司和承包商。一个承包商可以为多个公司工作,而一个公司可以有多个承包商。这是直接的多对多关系。我希望能够回答有关公司和承包商的问题: 给定一家公司,他们是当前的承包商。 给承包商一个他们要工作的公司。 在Firebase中构造数据的替代方法有哪些? 问题答案: 自我回答确实是对此进行建模的一种方法。它可能是在关系数据库中建模的最直接等效方法: 承办商
问题内容: 我知道在Elasticsearch中,我们可以在文档之间建立子/父关系。 然后,在建立索引时,我可以传递父代ID,以便将子文档和父文档链接起来: 无论如何,在Elasticsearch中建立多对多关系的模型吗? 数据驻留在具有以下架构的MySQL数据库中: 当前这是我的映射(请原谅数组表示法,我在PHP中使用Elastica与我的Elasticsearch服务器通信): 这种方法的问题
如何以多对多关系从Firebase Cloud Firestore构建和查询数据? 我有公司和承包商。一个承包商可以为多个公司工作,一个公司可以有多个承包商。这是一种简单的多对多关系。我希望能够回答有关公司和承包商的问题: 给定一家公司,谁是目前的承包商。给承包商他们在为什么公司工作。什么是正确的方式来构建Cloud Firesta中的数据?
我还想知道如何定义每个模型上的关系--你是否需要或者是否可以只在用户上定义关系?
问题内容: 伙计们,我正在努力为我的公司制作一个简单的票证生成系统,以吸引人。目前,我的MSSQL数据库中有一个名为的表,另一个名为的表。 我的应用程序是C#Windows窗体,因此在新的票证生成窗体上,我有许多文本框和一个用于分配工程师的comboBox,由填充。生成票证后,以这种形式输入的所有信息都将与from一起存储。 效果很好,但是后来我的客户要求我添加选项,以便可以在一张票上分配3名工程