Après plus de recherches, je vais essayer de répondre à ma propre question. J'ai examiné un certain nombre d'autres publications et une solution au problème de many-to-many est de stocker une liste de ContractorKeys dans un objet Company et de stocker une liste de CompanyKeys dans chaque objet contractant. Cela est illustré avec un exemple ci-dessous.
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
}
}
}
Cette organisation "fonctionne" dans le sens où les questions mentionnées précédemment peuvent être répondues. Mais un inconvénient de cette solution est qu'il y a deux listes à maintenir lorsque les affectations Contractor/Company changent. Il serait mieux s'il y avait un moyen de représenter ces informations dans une seule liste.
Je pense avoir trouvé une meilleure solution. La solution est de créer une troisième liste, en plus de companies et contractors appelée companyAndContractorAssignment. Les éléments de cette liste représenteront une relation entre un seul contractant et une entreprise. Son contenu sera une paire de champs, le contractorKey et le companyKey. Nous pouvons ensuite éliminer la liste des entrepreneurs au sein de l'entreprise et la liste des entreprises chez le contractant. Cette structure alternative est représentée ci-dessous. Remarquez qu'il n'y a pas de liste d'entrepreneurs dans un objet d'entreprise et pas de liste d'entreprises dans un objet de contractant.
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,
}
Cette structure alternative permet de répondre aux questions en utilisant une requête orderByChild/equalTo sur companyAndContractorsAssignment pour trouver toutes les entreprises pour un contractant ou tous les contractants pour une entreprise. Et il n'y a maintenant qu'une seule liste à maintenir. Je pense que c'est la meilleure solution pour mes besoins.