MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Comment gérer les relations lors de l'utilisation de mongodb

MODIFIER :

Je viens de trouver une réponse de Brendan McAdams, un gars de la 10e génération, qui est évidemment bien plus autoritaire que moi, et il recommande d'intégrer des documents.

ancien texte :

La première consiste à inclure manuellement à chaque commentaire l'ObjectID de l'utilisateur auquel ils appartiennent.

comment: { text : "...", 
           date: "...", 
           user: ObjectId("4b866f08234ae01d21d89604"),
           votes: 7 }

La seconde, et la manière la plus intelligente consiste à utiliser DBRefs

nous ajoutons des E/S supplémentaires à notre disque, perdant des performances, n'est-ce pas ? (je ne sais pas comment cela fonctionne en interne) nous devons donc éviter les liens si possible, n'est-ce pas ?

Oui - il y aurait une autre requête, mais le pilote le fera pour vous - vous pouvez considérer cela comme une sorte de sucre de syntaxe. Cela affecte-t-il les performances ? En fait, cela dépend aussi :) L'une des raisons pour lesquelles Mongo est si rapide est qu'il utilise fichiers mappés en mémoire et mongo fait de son mieux pour conserver tout le jeu de travail (plus les index) directement dans la RAM. Et toutes les 60 secondes (par défaut), il synchronise l'instantané RAM avec le fichier sur disque.
Quand je dis ensemble de travail , je veux dire les choses avec lesquelles vous travaillez :vous pouvez avoir trois collections - foo , barre , baz , mais si vous ne travaillez maintenant qu'avec foo et bar, ils doivent être chargés dans la RAM, tandis que baz reste abandonné sur le disque. De plus, les fichiers mappés en mémoire permettent de ne charger qu'une partie de la collection. Donc, si vous construisez quelque chose comme engadget ou techcrunch, il y a une forte probabilité que l'ensemble de travail soit des commentaires pour les derniers jours et les anciennes pages seront réactivées beaucoup moins fréquemment (les commentaires seraient générés en mémoire à la demande), donc ce n'est pas le cas n'affecte pas les performances de manière significative.

Donc, récapitulez :tant que vous continuez à travailler en mémoire (vous pouvez penser qu'il s'agit d'une mise en cache en lecture/écriture), la récupération de ces éléments est ultra-rapide et une requête de plus ne poserait pas de problème. Si vous travaillez avec des tranches de données qui ne rentrent pas dans la mémoire, il y aurait de la vitesse dégradation , mais je ne connais pas votre situation actuelle :cela pourrait être acceptable, donc dans les deux cas, j'ai tendance à choisir do use lien.