51

J'ai deux tables/collections; Utilisateurs et groupes Un utilisateur peut être membre d'un nombre quelconque de groupes et un utilisateur peut également être propriétaire d'un nombre quelconque de groupes. Dans une base de données relationnelle, j'aurais probablement une troisième table appelée UserGroups avec une colonne UserID, une colonne GroupID et une colonne IsOwner. J'utilise MongoDB et je suis sûr qu'il existe une approche différente pour ce type de relation dans une base de données de documents. Dois-je intégrer la liste des groupes et des groupes-en tant que propriétaire dans la table des utilisateurs en tant que deux tableaux d'ObjectID? Dois-je également stocker la liste des membres et des propriétaires dans la table Groupes sous la forme de deux tableaux, en reflétant la relation provoquant une duplication des informations de relation?Comment organiser une relation plusieurs à plusieurs dans MongoDB

Ou est une table UserGroups de pontage un concept légitime dans les bases de données de documents pour de nombreuses relations?

Merci

+0

Voir aussi les réponses à [cette question] (http://stackoverflow.com/questions/2336700/mongodb-many-to-many-association) et [cette question] (http://stackoverflow.com/questions/ 5498692/many-to-many-relations-in-couchdb-or-mongodb) –

+0

Je sais que c'est plutôt vieux mais je m'interroge aussi sur l'échelle.Et si vous avez 1000 groupes? – FarscapePROJ

+0

Point important - Une autre option, dans ce cas, consiste à utiliser l'équivalent d'une relation de jonction d'une base de données SQL - une collection intermédiaire avec deux clés étrangères - une pour chaque collection associée. Dans ce cas, vous pouvez exécuter 3 requêtes: (1) un find() normal pour obtenir les résultats parents, (2) une requête IN pour obtenir les résultats intermédiaires et enfin (3) une requête IN utilisant les clés étrangères dans le résultats intermédiaires pour trouver des enregistrements enfants. (Voici comment nous implémentons cette fonctionnalité dans Waterline) – mikermcneil

Répondre

34

Ce que j'ai vu faire, et ce que j'utilise actuellement des tableaux sont intégrés avec identifiant de nœud de dans chaque document.

document pour user1 a des groupes de propriété: [ID1, ID2]

Et le document a groupe1 utilisateurs de la propriété: [USER1]. Le groupe de documents 2 a également des utilisateurs de propriété: [utilisateur1].

De cette façon, vous obtenez un objet Groupe et sélectionnez facilement tous les utilisateurs liés, et la même chose pour l'utilisateur.

Cela prend un peu plus de travail lors de la création et la mise à jour de l'objet. Quand vous dites que 2 objets sont liés, vous devez mettre à jour les deux objets.

Il y a aussi un concept DBReferences dans MongoDB et en fonction de votre pilote, il tirera automatiquement les objets référencés lors de la récupération d'un document.

http://www.mongodb.org/display/DOCS/Database+References#DatabaseReferences-DBRef

+0

Excellent merci de m'avoir indiqué les docs aussi. Fait sens maintenant, c'est une approche différente et plus flexible et performant c'est excitant d'entrer dans ce genre de choses. Aussi http://www.mongodb.org/display/DOCS/Schema+Design –

+7

Vient de voir Kyle Banker répondre à ma question à 29 minutes dans cette vidéo de présentation: http://www.blip.tv/file/3704083. N'utilisez jamais une table de jointure pour représenter plusieurs-à-plusieurs, mais plutôt une liste d'ObjectIds dans les deux collections. –

+8

Avoir une liste d'utilisateurs dans le document de groupe pourrait devenir rapidement hors de contrôle alors que vous avez potentiellement des milliers d'utilisateurs? – PJH

2

Comprenons Beaucoup à de nombreux rapports avec un exemple

  • livres aux auteurs
  • étudiants aux enseignants

Les livres aux auteurs est un peu à quelques relation, de sorte que nous pouvons avoir soit un tableau de livres ou d'auteurs dans le docume d'un autre NT. Idem pour les étudiants aux enseignants. Nous pourrions également intégrer au risque de duplication. Cependant ceci exigera que chaque étudiant ait un enseignant dans le système avant l'insertion et vice versa. La logique de l'application peut toujours ne pas l'autoriser. En d'autres termes, l'objet parent doit exister pour que l'objet enfant existe.

Mais lorsque vous avez plusieurs à plusieurs relation, utilisez deux collections et avoir une véritable liaison.

1

En cas de personne intéressée, je viens de tomber sur un très bon article posté sur le blog mongoDB. 6 Rules of Thumb for MongoDB Schema Design. Il y a 3 parties dans cet article, après avoir lu tous les 3 vous aurez une bonne compréhension.

Questions connexes