经过进一步研究,我将尝试回答我自己的问题。我已经查看了许多其他帖子,多对多问题的一种解决方案是将 ContractorKeys 列表存储在 Company 对象中,并将 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 的公司和承包商之外。此列表的元素将代表单个承包商和公司之间的关系。它的内容将是一对字段,contractorKey 和 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,
}
这种替代结构允许使用关于 companyAndContractorsAssignment 的 orderByChild/equalTo 查询来回答问题,以查找承包商的所有公司或公司的所有承包商。现在只有一个列表需要维护。我认为这是满足我要求的最佳解决方案。