2010-09-18 6 views
3

Je veux stocker quelques positions génomiques (chromosome, position) en utilisant MongoDB.MongoDB: Quel est le moyen le plus efficace pour stocker un chromosome/position

quelque chose comme:

{ 
chrom:"chr2", 
position:100, 
name:"rs25" 
} 

Je veux être en mesure de trouver rapidement tous les enregistrements dans un segment donné (chrom, [posStart - posEnd]). Quel serait le meilleur clé/_id à utiliser?

un chrom, objet de position?

db.snps.save({_id:{chrom:"chr2",position:100},name:"rs25"}) 

une chaîne rembourrée?

db.snps.save({_id:"chr02:00000000100",chrom:"chr2",position:100,name:"rs25"}) 

un identifiant généré automatiquement avec un index sur chrom et la position?

db.snps.save({chrom:"chr2",position:100,name:"rs25"}) 

autre?

??? 

Merci pour votre suggestion (s)

Pierre

PS: (cette question a été croisée affichée sur Biostar: http://biostar.stackexchange.com/questions/2519)

+0

J'ai posté un benchmark sur mon blog: http://plindenbaum.blogspot.com/2010/09/indexing-some-genomic-positions-with.html – Pierre

Répondre

2

je crois que l'index de deux colonnes offrira le chemin d'accès le plus rapide, car ce sera l'index le plus compact. Cependant, ce sera un index supplémentaire (puisque vous avez déjà l'index _id, que vous n'utilisez pas), donc les deux premières options sont sympas car elles éliminent l'index supplémentaire.

La chaîne rembourrée est plus courte que la solution d'objet complexe, plus courte signifie moins d'utilisation de la mémoire, donc plus rapide le balayage. J'irais seulement pour l'objet complexe, si l'aplatissement/remplissage n'est pas possible. En outre, comme les clés d'objet complexes doivent être codées dans l'index (pas dans le cas d'autres index), choisissez des noms de clé plus courts (c et p). Donc, j'opterais pour un index à deux colonnes (si cela ne vous dérange pas "gaspiller" l'index d'id) ou une chaîne rembourrée. Vous pouvez même aller binaire rembourré (en sauvant quelques octets sur l'encodage de l'entier), mais cela ne vaut probablement pas la peine.

+0

merci, je vais valider cette réponse intéressante. – Pierre

Questions connexes