2011-01-05 5 views
5

Je suis assez nouveau sur MongoDB et NoSQL en général. J'ai une collection Thèmes, où chaque sujet peut avoir beaucoup de commentaires. Chaque commentaire aura des métadonnées et ce qui n'est pas utile pour faire une collection de commentaires. Dans MySQL, j'utiliserais des clés étrangères pour créer un lien vers la table des commentaires, mais dans NoSQL devrais-je simplement inclure la collection a Comments dans la collection Topics ou la placer dans une collection et un lien séparés par des ids?MongoDB: Devriez-vous toujours fournir des identifiants reliant d'autres collections ou simplement inclure des collections?

Merci! Matt

+0

duplication possible de [relations MongoDB pour les objets] (http://stackoverflow.com/questions/4253496/mongodb-relationships-for-objects) –

Répondre

8

Cela dépend.

Cela dépend du nombre de chacun de ces types d'objets que vous prévoyez d'avoir. Pouvez-vous les intégrer tous dans un seul document MongoDB pour un sujet donné? Probablement pas.

Cela dépend des relations - avez-vous des relations un-à-plusieurs ou plusieurs-à-plusieurs? Si c'est un-à-plusieurs et que le nombre d'entités apparentées est petit, vous pouvez choisir de les intégrer dans un IList sur un document. Si c'est beaucoup-à-plusieurs, vous pouvez choisir d'utiliser une relation plus traditionnelle ou vous pouvez choisir d'intégrer les deux côtés comme ILists.

Vous pouvez toujours modéliser des relations dans MongoDB avec des collections distinctes MAIS il n'y a pas de jointures dans la base de données, vous devez donc le faire dans le code. Le chargement d'un sujet, puis le chargement des commentaires, peuvent être très utiles du point de vue de la performance.

Autres conseils:

Avec MongoDB vous pouvez indexer dans des tableaux sur les documents. Donc, ne pensez pas à un index comme étant simplement un index sur un champ simple sur un document (comme SQL). Vous pouvez utiliser, disons, une collection de balises sur un sujet et un index dans les balises. (Voir http://www.mongodb.org/display/DOCS/Indexes#Indexes-Arrays)

Lorsque vous récupérez ou écrivez des données, vous pouvez effectuer une lecture partielle et une écriture partielle de n'importe quel document. Et, enfin, quand vous ne pouvez pas voir comment obtenir ce que vous voulez en utilisant des collections et des index, vous pourriez être en mesure de le faire en utilisant map reduce. Par exemple, pour trouver toutes les balises actuellement utilisées, triées en fonction de leur fréquence d'utilisation, vous mappez chaque Rubrique émettant les balises utilisées, puis vous réduisez ce jeu pour obtenir le résultat souhaité. Vous pouvez ensuite stocker le résultat de cette carte de manière permanente et ne la mettre à jour que lorsque vous en avez besoin. Il s'agit d'un changement de mentalité assez important par rapport à la pensée relationnelle, mais cela en vaut la peine si vous avez besoin de l'évolutivité et de la flexibilité qu'apporte une approche NOSQL.

2

Consultez également les documents Schema Design (http://www.mongodb.org/display/DOCS/Schema+Design). Il y a aussi quelques vidéos/diapositives de plusieurs présentations 10Gen sur la conception de schémas liés au site Mongo. Voir http://www.mongodb.org/pages/viewpage.action?pageId=17137769 pour un aperçu.

Questions connexes