Relation de plusieurs à plusieurs dans Firebase

j'ai une base de données Firebase. J'ai des entreprises et des entrepreneurs. Un entrepreneur peut travailler pour plus d'une compagnie et une compagnie peut avoir plusieurs entrepreneurs. C'est une simple relation plusieurs vers plusieurs. Je veux être en mesure de répondre aux questions sur les entreprises et les entrepreneurs:

  1. donné une société, qui sont les entrepreneurs actuels.
  2. a donné à un entrepreneur ce pour quoi ils travaillent.

quelles sont les alternatives pour structurer les données dans firebase?

25
demandé sur Community 2017-01-08 01:01:23

2 réponses

L'auto-réponse est en effet une façon de modélisation. C'est probablement l'équivalent le plus direct de la façon dont vous modéliseriez ceci dans une base de données relationnelle:

  • entrepreneurs
  • entreprises
  • companyAndContractorsAssignment (plusieurs-à-plusieurs connecteur tableau)

une alternative serait d'utiliser 4 noeuds de haut niveau:

  • entrepreneurs
  • entreprises
  • companycontracteurs
  • contractor companies

les deux derniers noeuds ressembleraient à:

companyContractors
    companyKey1
        contractorKey1: true
        contractorKey3: true
    companyKey2
        contractorKey2: true
contractorCompanies
    contractorKey1
        companyKey1: true
    contractorKey2
        companyKey2: true
    contractorKey3
        companyKey1: true

cette structure bidirectionnelle vous permet à la fois de chercher des" entrepreneurs pour une société "et des" entreprises pour un entrepreneur", sans qu'aucune de ces deux ne doive être une requête. Cela sera sûrement plus rapide, surtout si vous ajoutez des entrepreneurs et des entreprises.

si cela est nécessaire pour votre application, dépend des cas d'utilisation dont vous avez besoin, les tailles de données que vous attendez et bien plus encore.

lectures Recommandées NoSQL modélisation des données et l'affichage Firebase pour SQL développeurs . Cette question a également figuré dans un épisode de la série youtube .

mise à Jour (2017016)

Quelqu'un a posté question de suivi qui lie ici au sujet de la récupération des articles réels des noeuds "entrepreneurs" et "entreprises". Vous devrez les récupérer une à la fois, puisque Firebase n'a pas l'équivalent de SELECT * FROM table WHERE id IN (1,2,3) . Mais cette opération n'est pas aussi lente que vous pourriez le penser, parce que les requêtes sont pipelinées sur une seule connexion. Lire la suite de cela ici: accélérer les messages de recherche pour mon application de réseau social en utilisant la requête au lieu d'observer un seul événement répété .

19
répondu Frank van Puffelen 2017-07-10 16:53:06

après d'autres recherches, je vais essayer de répondre à ma propre question. J'ai passé en revue un certain nombre d'autres postes et une solution au problème de plusieurs à plusieurs est de stocker une liste de ContractorKeys dans un objet de la société et stocker une liste de CompanyKeys dans chaque objet de l'entrepreneur. Ceci est illustré par 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 "œuvres" dans le sens que ces questions peuvent être répondues. Mais un inconvénient de cette la solution est qu'il y a deux listes à tenir à jour lorsque les attributions de L'entrepreneur ou de la compagnie changent. Il serait mieux si il y avait un moyen de représenter cette information dans une liste unique.

je pense que j'ai trouvé une meilleure solution. La solution est de créer une troisième liste, en plus des entreprises et des entrepreneurs appelés company and contractorassignment. Les éléments de cette liste représenteront une relation entre un entrepreneur et une entreprise. Son contenu sera un paire de champs, la contractorKey et la companyKey. Nous pouvons alors éliminer la liste des entrepreneurs au sein de la société et la liste des entreprises au sein de l'entrepreneur. Cette structure alternative est représentée ci-dessous. Avis il n'y a pas de liste d'entrepreneurs dans un objet de la société ni de liste d'entreprises avec un objet de la société.

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 un orderByChild / equalTo query sur companyAndContractorsAssignment pour trouver soit toutes les entreprises un entrepreneur ou tous les entrepreneurs pour une entreprise. Et il n'existe qu'une seule liste à maintenir. Je pense que c'est la meilleure solution pour mes besoins.

4
répondu Rob Gorman 2017-01-08 16:28:59