J'essaie d'utiliser MongoDB, C # et NORM pour travailler sur certains projets d'échantillons, mais à cette POINT, je vais avoir un temps beaucoup plus difficile enroulant ma tête autour du modèle de données. Avec les données connexes de RDBMS n'est pas un problème. À MongoDB, cependant, j'ai du mal à décider de quoi faire avec eux. P>
Utilisons Stackoverflow comme exemple ... Je n'ai aucun problème à comprendre que la majorité des données sur une page de questions doivent être incluses dans un document. Titre, Texte de la question, révisions, commentaires ... tout bon dans un objet de document. P>
Où puis-je commencer à me démarquer est sur la question de Données utilisateur forts> comme nom d'utilisateur, avatar, réputation (qui change particulièrement souvent) ... Désormalisez-vous et mettez-vous à jour des milliers d'enregistrements de documents chaque fois là-bas est un utilisateur change ou vous liez-vous en quelque sorte les données ensemble? p>
Quel est le moyen le plus efficace d'accomplir une relation d'utilisateur sans que des tonnes de requêtes se produisent sur chaque charge de page? J'ai remarqué le Merci pour votre aperçu! P> dbreference
4 Réponses :
Pourquoi vous voulez éviter la dénormalisation et la mise à jour des "milliers d'enregistrements de document"? MongoDB DB conçu pour la dénormalisation. Stackoverlow Manipulez des millions de données différentes en arrière-plan. Et certaines données peuvent être obsolètes pendant une courte période et ça va bien. P>
Une idée principale de ci-dessus indique que vous devriez avoir des documents dénormalisés afin de les afficher rapidement à l'interface utilisateur. P>
Vous ne pouvez pas interroger par document référencé, de quelque manière que ce soit de dénormalisation. p>
Aussi, je suggère de jeter un coup d'œil à architecture CQRS . P>
Ce n'est pas que je veux éviter la dénormalisation, mais je veux éviter de conception intrinsèquement. Détachement de quelque chose d'aussi courant qu'un enregistrement d'utilisateur au point où je pourrais être mis à jour des milliers d'enregistrements d'utilisateur par seconde semble systématiquement 1. Comme sur la surkillée 2. Comme une mauvaise utilisation de l'espace disque. N'y a-t-il pas d'autres options?
Cela dépend de ce que vous voulez: si vous vous souciez de «l'espace disque» et de la dénormalisation comme surkill pour vous que probablement ma réponse non pour vous, mais si vous vous souciez de la performance et que vous souhaitez atteindre une vitesse de la vitesse - que vous ne devriez aller décrits ci-dessus. .
Sans parler, l'espace disque est pas cher i>
Pensées sur dbref? Je crois comprendre que les enregistrements fréquemment consultés sont mis en cache et toujours très performant. Mongodb.org/display/docs/database+References
Oui, bien sûr, j'ai pensé à la première fois de Dbref à partir de bases de données relationnelles du monde. DBRef in MongoDB est toujours mauvais, car il est fait du côté du client (à l'intérieur du conducteur), la mise en cache est de bonus, mais la dénormalisation est meilleure, car avec des données dénormalisées, vous pouvez interroger avec DBRef, également DBRef, il est également des demandes supplémentaires à la base de données.
Essayez d'enquêter sur Sourcing CQRS et événement Architecture. Cela vous permettra de mettre à jour toutes ces données par la file d'attente. P>
Je pense que vous devez trouver un équilibre. P>
Si j'étais vous, je voudrais juste faire référence à l'ID utilisateur au lieu de leur nom / réputation dans chaque poste. P>
Contrairement à un RDBMS cependant, vous choisiriez d'avoir des commentaires intégrés dans le document. P>
Je suis d'accord. J'ai aimé utiliser dbref, car les données d'utilisateur sont sujettes à des mises à jour fréquentes. Les commentaires d'autre part sont parfaitement acceptables dans un document.
La balance que j'ai trouvée utilise SQL comme base de données normalisée et Mongo comme une copie dénormalisée. J'utilise un ESB pour les conserver en synchronisation les uns avec les autres. J'utilise un concept que j'appelle "Documents préparés" et "Documents stockés". Les documents stockés sont des données qui ne sont conservées que dans Mongo. Utile pour les données qui ne sont pas relationnelles. Les documents préparés contiennent des données pouvant être reconstruites à l'aide des données dans la base de données normalisée. Ils agissent comme des caches vivants d'une manière - ils peuvent être reconstruits à partir de zéro si les données ne sont jamais synchronisées (dans des documents compliqués, il s'agit d'un processus coûteux, car ces documents nécessitent de nombreuses requêtes à reconstruire). Ils peuvent également être mis à jour un champ à la fois. C'est ici que l'autobus de service est entré. Il répond aux événements envoyés après la mise à jour de la base de données normalisée, puis met à jour les documents préparés de Mongo pertinents. p>
Utilisez chaque base de données à leurs forces. Autoriser SQL la base de données d'écriture qui assure l'intégrité des données. Laissez Mongo Soyez la base de données en lecture seule qui est rapide et peut contenir des sous-documents afin que vous ayez besoin de moins de questions. p>
** Modifier ** Je viens de relire votre question et j'ai réalisé ce que vous demandiez réellement. Je pars ma réponse originale au cas où elle est utile du tout. p>
La manière dont je voudrais gérer l'exemple Stackoverflow que vous avez donné est de stocker l'ID utilisateur dans chaque commentaire. Vous chargeriez le poste qui aurait tous les commentaires dedans. C'est une requête. p>
Vous traverseriez ensuite les données de commentaire et retirez un tableau d'ID utilisateur que vous devez charger. Puis chargez ceux-ci comme une requête de lot (à l'aide de l'opérateur Q.in () de requête). C'est deux questions totales. Vous auriez alors besoin de fusionner les données ensemble dans une forme finale. Il y a un équilibre que vous devez grimper entre quand le faire comme ça et quand utiliser quelque chose comme un ESB pour mettre à jour manuellement chaque document. Utilisez ce qui fonctionne mieux pour chaque scénario individuel de votre structure de données. P>
J'aime cette solution. Chargement du lot d'ID utilisateur puis l'assemblage des données est une bonne idée.
+1, je me suis demandé la même chose.