2

Ceci est une question assez courante sur MongoDB: Quand l'intégrer et quand faire référence.Opinion sur mon cas Conception de schéma MongoDB

Cependant dans mon cas, cela semble être en quelque sorte un dilemme. J'ai un document qui a une référence où je pourrais juste l'incorporer, pourtant cela me coûtera la taille du disque. Mais si je fais une référence, cela me coûtera très cher.

Voici un exemple, disons que je ce membre avec le « détail » comme mon problème:

Member: { 
    _id: "abc", 
    detail: { 
     name: "Stack Overflow", 
     website: "www.stackoverflow.com" 
    } 
} 

Je veux que ce le détail du député d'être dans tous les blogs ce membre « asdf » fait cause chaque blog affiché serait affiche les détails du membre. Donc, il y a 2 options que je peux faire pour mon document Blog:

Tout d'abord, faire une référence que par la mise de _id du membre:

Blog: { 
    _id: 123, 
    memberId: "asdf" ---> will be used as reference to query specific member 
} 

ou deuxième, incorporez le membre dans Blog place:

Blog: { 
    _id: 123, 
    member: { 
     _id: "asdf", 
     detail: { 
      name: "Stack Overflow", 
      website: "www.stackoverflow.com" 
     } 
    } 
} 

La première option nécessite donc une autre requête pour le membre, ce qui pose un problème de performance. La deuxième option est cependant plus rapide parce que je n'ai besoin de faire qu'une seule requête, mais mon disque serait plus gros pour les données redondantes du document incorporé 'membre' à mesure que le nombre de blogs augmente. PS: Comme vous pouvez le voir dans cet exemple, la relation Membre et Blog est un-à-plusieurs, de sorte qu'un membre peut avoir plusieurs blogs, mais les variables de détail des membres restent les mêmes; 'nom' et 'site web'.

Une opinion qui est meilleure dans ce cas? Ce sera génial si vous avez aussi la 3ème solution. Merci avant.

Répondre

1

Je pense qu'il est bon de garder les détails des membres séparés, comme une signature de forum. De cette façon, lorsqu'un membre met à jour ses informations, tous les messages afficheront ses informations actuelles sans que votre application doive mettre à jour les données en double dans tous les messages précédents. D'après votre description, il semble que vous ne puissiez l'afficher que sur les billets de blogs que les utilisateurs créent, plutôt que sur chaque commentaire qu'ils font sur une page. Si vous êtes préoccupé par le coût de performance d'une requête supplémentaire par utilisateur, vous pouvez toujours mettre en cache les données utilisateur (ou la sortie de page générée) au lieu de récupérer toutes les informations de blog dans une seule requête DB. Je verrais comment l'application fonctionne dans l'utilisation réelle avant d'essayer d'optimiser pour un cas d'utilisation qui ne peut pas être un problème.

Une autre approche serait de ne montrer que les détails de l'utilisateur supplémentaires comme un vol stationnaire Ajax (similaire à la façon dont montre SO plus d'informations pour un established user.

+0

Merci! Je ne pensais pas assez loin jusqu'à ce que vous nous avez expliqué au premier alinéa En fin de compte, dans mon cas, le doc incorporé pour les données qui sont fréquemment mises à jour par référence (le détail du membre) me donnera aussi le coût de la performance, donc je vais choisir le séparé, merci pour la suggestion du cache aussi, Stennie. –

Questions connexes