2012-02-07 8 views
3

Quelle est la meilleure façon de stocker des structures similaires dans MongoDB? Choisissez une collection pour tous ou une pour chaque structure? Des avantages d'en avoir un/peu?Choix de la structure de collections MongoDB pour des structures de données similaires

Par exemple, je dois stocker des journaux pour d'autres analyses. Il y a une partie commune pour chaque structure et des données spécifiques pour un certain type de stat, comme:

{ 
    timestamp: ..., 
    client: { ... }, 
    type: 'stats_for_item1', 
    data: { 
    id: ObjectId('xxx'), 
    field1: 1, 
    field2: 2 
    } 
}, 
{ 
    timestamp: ..., 
    client: { ... }, 
    type: 'stats_for_item2', 
    data: { 
    id: ObjectId('zzz'), 
    field3: 3, 
    field4: { 
     field5: [5, 1] 
    } 
    } 
} 

Comme vous le voyez, nous avons une partie commune, et data terrain, avec quelques champs différents pour item1 et item2.

Semble que seuls les champs timestamp et type seront indexés (et _id bien sûr). Et il y a un nombre limité de ces articles, disons 3 types d'articles au total. Il y aura beaucoup d'écritures, et une petite quantité de lectures

Alors, ma question, comment organiser de telles structures? Utilisez une grande collection stats et y stockez tout? ot créer quelques collections stats_item1, stats_item2 et stats_item3. Qu'est-ce qui est optimal? Des avantages? Du point de vue mongo, pour sharding/indexing/querying/locking/etc?

Répondre

3

Je conserverais probablement une collection. Dans le cas où vous obtenez un autre type de statistiques plus tard, vous n'avez pas besoin de réorganiser votre code autour de la nouvelle collection que vous devez ensuite ajouter. Vous pouvez rechercher spécifiquement sur les éléments où vous avez un type spécifique en créant un index sur "type", mais vous pouvez également rechercher tous les éléments car vous les avez tous dans une collection avec un index sur "horodatage". (Veuillez noter que MongoDB ajoute également un champ _id à chaque document, auquel cas il ajoutera également un index).

Pour sharding, vous devrez choisir une clé par collection. Je ne sais pas quels sont vos taux d'écriture/lecture et comment vous avez l'intention de lire les données, mais je suppose que vous faites une sorte de journalisation avec une analyse plus tard. Dans ce cas, peut-être qu'une clé sur "client" est la plus logique. L'horodatage va probablement être un mauvais choix car il forcerait toutes les écritures à un fragment. La différence entre une ou trois collections pour le verrouillage ne fait pas beaucoup de différence, car pour le moment, mongoDB ne verrouille pas par collection (seulement par instance de serveur avec verrou cédant dans 2.0, et par DB avec verrou cédant dans le prochain 2.2).

acclamations,

Derick

Questions connexes