2012-06-28 9 views
1

Je suis en train de développer une application web où les utilisateurs téléchargeront un grand nombre de documents sur le système et différents types d'opérations seront effectuées sur les documents, y compris l'agrégation. Cependant, le nombre de documents téléchargés par chaque utilisateur varie considérablement - certains pourraient télécharger une douzaine de documents, et certains pourraient télécharger un million de documents.Clé sharding (MongoDB) pour les documents de grand nombre

documents ressemblent à ceci:

doc{ 
    _id: <self generated UUID>, 
    uid: <id of user who uploaded the document>, 
    ctime: <creation timestamp>, 
    .... 
     <other attributes, etc> 
    .... 
} 

Maintenant, voici le problème dans le choix de la touche tesson:
1. Si je choisis l'UUID comme la clé de tesson, documents téléchargés par le même utilisateur est peu probable se retrouver dans la même partition et les opérations d'agrégation seront coûteuses.
2. Si j'utilise uid comme clé de partition, les données stockées dans les partitions ne seront pas paires.

Quelqu'un peut-il suggérer quel est le meilleur moyen d'y parvenir?

Je suis très novice dans le domaine du partitionnement et du sharding, et mes recherches sur google ainsi que sur le stack-overflow n'ont rien donné. Je peux changer le schéma des documents si nécessaire puisque le projet est encore en phase de conception.

+0

Comment voulez-vous interroger les données? –

Répondre

3

C'est le meilleur guide que j'ai vu sur le choix d'une clé tesson: http://www.kchodorow.com/blog/2011/01/04/how-to-choose-a-shard-key-the-card-game/

Vous devez décider comment vous voulez interroger les données. Peut-être qu'une combinaison de uid et de ctime donnera une bonne clé, mais je ne suis pas sûr que cela vous causera du chagrin pendant l'interrogation, car vous n'avez pas donné beaucoup d'informations sur la façon dont vous envisagez d'interroger.

+0

Merci pour le lien. Je vais à travers maintenant, mais cela semble un peu confus. Je souhaite interroger les données en fonction de l'UUID ou d'une combinaison de (uid, parentid). C'est tout - le reste des champs change de document en document de toute façon. Pour info, le parent est l'identifiant du document parent (comme les pages wordpress). Cependant, je vais exécuter certaines fonctions comme count_child_docs (parentid) qui va scanner récursivement 'l'arbre'. C'est pourquoi je veux avoir autant que possible les données sur un seul fragment. J'ai pensé à créer la clé sur (uid, parentid) mais parentid peut changer, donc les mises à jour peuvent être coûteuses. –

+0

Je suis allé à travers l'article à nouveau et joué avec la démo fournie là. Je pense que la meilleure clé pour mon cas serait (uid, UUID). Mais je suppose que nous devrons garder la taille du morceau petite pour optimiser pour l'utilisateur avec un très faible nombre de téléchargements. @ wes-freeman: Quelle est votre opinion? –

+0

Votre idée semble bonne. Il vaut vraiment la peine de tenter un test - assurez-vous de tester les insertions (pour vous assurer qu'elles ne vont pas toutes sur le même fragment) et interrogez (pour vous assurer qu'elles vont en général à 1-2 fragments et évitez beaucoup de fusion). Cependant, je ne pense pas que vous ayez besoin de garder la taille du morceau. Vos requêtes uuid peuvent-elles inclure l'uid, ou n'est-ce pas connu? –

Questions connexes