2013-03-09 6 views
28

J'ai besoin d'aide pour modéliser mes données en mongo. La plupart de mon expérience a été dans les bases de données relationnelles, je commence juste avec mongo. Je modélise des données pour différents événements.Mongodb: plusieurs collections ou une grande collection w/index

  1. Chaque 'événement' ayant les mêmes champs. Chaque événement aura des centaines à des millions de documents/lignes
  2. Les événements sont dynamiques, c'est-à-dire que de nouveaux seront créés si nécessaire. Par exemple, peut-être créer un nouvel événement 'Summer Olympics 2016'.

Probablement le plus important, lorsqu'il s'agit d'événements (opérations CRUD) les utilisateurs devront spécifier un nom d'événement.

Je peux voir plusieurs façons de le faire jusqu'à présent et je ne veux pas faire une erreur majeure dans la configuration de mon modèle de données de «mauvais».

1) Une collection 'événements' contenant des données pour tous les événements. Index sur le nom de l'événement Requête ressemblerait à quelque chose comme:

db.events.find({event: 'Summer Olympics 2012'); 
{event: 'Summer Olympics 2012', attributes: [{name: 'joe smith', .... } 
{event: 'Summer Olympics 2012', attributes: [{name: 'jane doe', .... } 
{event: 'Summer Olympics 2012', attributes: [{name: 'john avery', .... } 
{event: 'Summer Olympics 2012', attributes: [{name: 'ted williams', .... } 

db.events.find({event: 'Summer Olympics 2013'}) 
{event: 'Summer Olympics 2016', attributes: [{name: 'steve smith', .... } 
{event: 'Summer Olympics 2016', attributes: [{name: 'amy jones', .... } 

2) Une collection pour chaque nouvel événement qui vient, w/collection de garder une trace de tous les noms d'événement. Aucun index sur le nom de l'événement n'est nécessaire car chaque événement est stocké dans une collection différente.

// multiple collections, create new as needed 
db.summer2012.find() // get summer 2012 docs 

db.summer2016.find() // get summer 2016 docs 

//'events' collection 
db.events.find() // get all events that I would have collections for 
{name: 'summer2012', title: 'Summer Olympics 2012}; 
{name: 'summer2016', title: 'Summer Olympics 2016}; 

Pour # 1 Je suis un peu inquiet qu'une fois que j'atteins 100 événements chacun avec des millions d'enregistrements par LookUps « événement » sera lente, même si l'un des événements a seulement 500 documents. Pour # 2 Est-ce que je "contourne" le modèle mongo ici en créant une nouvelle collection à chaque fois et l'événement arrive?

Tous les commentaires/idées sont les bienvenus, car je n'ai aucune idée de ce qui finira par mieux fonctionner ou si l'un ou l'autre me causerait plus de problèmes sur la route. J'ai regardé autour (le site de mongo inclus) et je ne peux vraiment pas trouver une réponse concrète.

+0

Quels sont ces attributs? Gens? Alors avez-vous des événements x personnes qui participent à un événement? Ces personnes sont-elles enregistrées dans votre système? Si vous venez de commencer à MongoDB, jetez un oeil à ceci: https://code.google.com/p/morphia/wiki/QuickStart – rbento

+0

Désolé mauvais exemple :(.Vraiment ses données géospatiales.Je vais avoir un x Les utilisateurs peuvent facilement ajouter/déposer une épingle sur la carte pour leur emplacement actuel et joindre des métadonnées sur cet emplacement, par exemple les photos/vidéo, le titre, la météo, etc Donc, imaginez un groupe de personnes lors de l'ajout olympique nouvelles données Personnes/emplacements Même différence La question est la suivante: chaque événement peut-il avoir des millions de documents si chaque événement doit être séparé dans sa propre collection, ou bien tous les documents d'événements doivent-ils être regroupés dans la même collection? collections qui ont chacune ~ 1 million de docs – lostintranslation

+0

Je viens aussi de commencer avec Mongo, je pense que cette partie du manuel est importante: http://docs.mongodb.org/manual/applications/indexes/ Cela me conduit à cette impression que la conception de MongoDb db, peut, et devrait être très similaire à la conception de DB, et ainsi, je pulmp pour votre première option, surtout si vous avez l'intention de faire des questions "cross-event" –

Répondre

38

De mongo docs ici: data modeling

Dans certaines situations, vous pouvez choisir de stocker des informations dans plusieurs collections plutôt que dans une seule collection. Considérez un exemple de journaux de collecte qui stocke des documents de journal pour divers environnements et applications. La collection de journaux contient documents du formulaire suivant:

{log: "dev", ts: ..., info: ...} {log: "debug", ts: ..., info:. ..}

Si le nombre total de documents est faible, vous pouvez regrouper les documents dans la collection par type. Pour les journaux, envisagez de conserver des collections distinctes de journaux , telles que logs.dev et logs.debug. La collection logs.dev ne contiendrait que les documents relatifs à l'environnement de développement.

Généralement, avoir un grand nombre de collections n'a pas de pénalité de performance significative et donne de très bonnes performances. Distinct collections sont très importants pour le traitement par lots à haut débit.

Également parlé avec 10gen guy. Pour les très grandes collections, il a énuméré plusieurs avantages pour séparer en plus petites collections plus spécifiques. Son commentaire sur l'utilisation d'une collection pour toutes les données et en utilisant un index était:

Ce n'est pas parce que vous pouvez faire quelque chose que vous devriez le faire. Modelez vos données de manière appropriée. peut être facile à stocker dans une grande collection et index, mais ce n'est pas toujours la meilleure approche.

Questions connexes