164 votes

Association MongoDB Plusieurs à plusieurs

Comment feriez-vous une association plusieurs-à-plusieurs avec MongoDB ?

Par exemple ; Imaginons que vous ayez une table utilisateurs et un tableau de rôles. Les utilisateurs ont de nombreux rôles et rôles ont beaucoup d’utilisateurs. Dans le land SQL, vous devez créer un tableau de UserRoles.

Comment le même type de relation est gérée en MongoDB ?

107voto

diederikh Points 17459

Selon votre requête doit vous pouvez mettre tout dans le document de l’utilisateur :

Pour obtenir tous les ingénieurs, utilisez :

Si vous voulez maintenir les rôles dans des documents distincts vous pouvez inclure le titre du document _id du tableau de rôles au lieu du nom :

et configurer les rôles comme :

40voto

paegun Points 344

Au lieu d'essayer de modéliser selon nos années d'expérience avec du SGBDR, j'ai trouvé beaucoup plus simple de modèle de document-référentiel des solutions à l'aide de MongoDB, Redis, et les autres magasins de données NoSQL par l'optimisation de la lecture des cas d'utilisation, tout en étant attentif de la atomique de l'écriture des opérations qui doivent être pris en charge par l'écriture des cas d'utilisation.

Par exemple, l'utilisation d'un "Utilisateurs dans des Rôles de" domaine suivre: 1. Rôle - Créer, Lire, mettre à Jour, Supprimer, Liste des Utilisateurs, Ajouter un Utilisateur, Supprimer des Utilisateurs, Désactivez Tous les Utilisateurs, l'Indice de l'Utilisateur ou similaires à support", Est l'Utilisateur Dans leur Rôle" (opérations comme un conteneur + ses propres métadonnées). 2. L'utilisateur Create, Read, Update, Delete (opérations CRUD comme un libre-debout entité)

Cela peut être modélisée par la suite des modèles de document: Utilisateur: { _id: id unique, nom: string, des rôles: string[] } Index: unique: [ nom ] Rôle: { _id: id unique, nom: string, utilisateurs: string[] } Index: unique: [ nom ]

À l'appui de la haute fréquence, tels que les Rôles liés à des caractéristiques de l'entité Utilisateur, Utilisateur.Les rôles sont intentionnellement dénormalisée, stockées sur l'Utilisateur ainsi que son Rôle.Les utilisateurs ayant un double stockage.

Si ce n'est pas évident dans le texte, mais c'est le type de pensée qui est encouragé lors de l'utilisation de référentiels de documents.

J'espère que cette aide à combler l'écart à l'égard de la lecture du côté de l'exploitation.

Pour l'écriture de côté, ce qui est encouragé consiste à modéliser selon atomique écrit. Par exemple, si le document de structures nécessitent l'acquisition d'un verrou de mise à jour d'un document, puis un autre, et peut-être plus de documents, puis relâcher le verrou, probablement le modèle a échoué. Tout simplement parce que nous pouvons construire distribués serrures ne veut pas dire que nous sommes censés les utiliser.

Pour le cas de l'Utilisateur dans des Rôles de modèle, les opérations qui s'étendent notre atomique écrire éviter les verrous d'ajout ou de suppression d'un Utilisateur à partir d'un Rôle. Dans les deux cas, la réussite de l'opération des résultats à la fois un Utilisateur unique et un seul Rôle document en cours de mise à jour. Si quelque chose tombe en panne, il est facile d'effectuer le nettoyage. C'est la raison pour laquelle l'Unité de Travail motif tout à fait un lot où les référentiels de documents sont utilisés.

L'opération qui vraiment s'étend notre atomique écrire évitement de serrures est la compensation d'un Rôle, ce qui aurait pour résultat de nombreuses mises à jour Utilisateur pour supprimer le Rôle.nom de l'Utilisateur.les rôles de tableau. Cette opération de claire est généralement déconseillée, mais si nécessaire, on peut être mis en œuvre par la commande d'opérations:

  1. Obtenir la liste des noms d'utilisateur à partir de Rôle.les utilisateurs.
  2. Parcourir les noms d'utilisateur à partir de l'étape 1, supprimer le nom du rôle de l'Utilisateur.les rôles.
  3. Clair le Rôle.les utilisateurs.

Dans le cas d'une question qui est plus susceptible de se produire à l'intérieur de l'étape 2, une restauration est facile que le même ensemble de noms d'utilisateur à partir de l'étape 1 peut être utilisé pour récupérer ou de continuer.

3voto

dans le cas où lorsque salarié et entreprise est objet d’entité essayez d’utiliser suivant le schéma :

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X