2012-01-12 8 views
1

J'ai des utilisateurs, ils peuvent créer des activités et les utilisateurs ont des amis et chaque utilisateur devrait être en mesure d'obtenir toutes les activités de leurs amis, une seule activité peut avoir plusieurs utilisateurs.Conception de base de données Mongodb

Users -> _id, name, friendList 
Activity -> _id, description, date, involvedUsers 

donc un exemple de document serait:

"User theo": 1, theo, array(mike, rutger, tijmen) 
"User mike": 2, mike, array(theo, rutger, tijmen) 

Activity x: 1, 'having fun with friends', {{todaydatetime}}, array(1, 2) 
Activity y: 2, 'going out', {{saturdaydatetime}}, array(1, 2) 

Alors maintenant, si les journaux « théo » dans, il doit obtenir que Mike « va se amuser avec des amis » même si les journaux Mike Et s'ils choisissent samedi comme date, Mike obtiendra que Theo sortira, et Theo obtiendra l'activité que Mike sortira. Comment puis-je accomplir cela, je sais que c'est assez facile dans MySQL avec des jointures etc, mais comment puis-je obtenir toutes les activités de l'utilisateur "liste d'amis" et filtré par une certaine date, par exemple me donner toutes les activités se passe samedi.

+0

Alors, pourquoi voulez-vous utiliser mongodb? Utilisez MySQL, vous savez comment le faire là-bas. –

+1

Ce n'était pas ma question, je dois utiliser MongoDb. – randomKek

+0

Puis-je vous demander pourquoi? –

Répondre

2

Vous voulez probablement quelque chose comme (ce qui est tout à fait non testé), et les autres ont raison, si vous avez trop grand des tableaux (en milliers) pour vos listes d'amis et votre impliqué, il sera probablement causer des problèmes d'échelle:

collection users: 
{ 
    _id: objid, 
    name: "theo", 
    friends: [objid, objid, objid] /* these are user object ids */ 
} 

collection activities: 
{ 
    _id: objid, 
    desc: "having fun with friends", 
    date: new Date(), 
    involved: [objid, objid, objid] /* these are user object ids */ 
} 

je ferais ensureIndex à la date et impliqués. Voir ici pour plus d'informations sur les valeurs de tableau d'indexation: http://www.mongodb.org/display/DOCS/Multikeys

db.activities.ensureIndex({date:1}); 
db.activities.ensureIndex({involved:1}); 

Donc, pour sélectionner les utilisateurs impliqués dans une activité que vous souhaitez faire (de la coquille):

var start_date = new Date(2012, 1, 14); 
var end_date = new Date(2012, 1, 15); 
var friends = db.users.findOne(_id: objid for user).friends; 
var activities = db.activities.find(
    { 
    date: {$gte : start_date}, 
    date: {$lte : end_date}, 
    involved : {$in : friends} 
    }); 
+0

Je comprends à propos de la liste d'amis, mais j'ai juste besoin de MongoDb aussi à cause des fonctionnalités de géocodage et des performances de mongodb. Que me conseilleriez-vous MySql? – randomKek

+0

J'utiliserais probablement mongodb de toute façon. Si vous finissez par avoir besoin d'utiliser un schéma différent pour prendre en charge plus d'amis ou plus impliqués, alors vous pouvez le diviser en différentes collections - il faudra plus de recherches pour obtenir vos réponses, cependant. –

+0

ne devrait-il pas être '$ lt' dans la sélection de la date, pour obtenir seulement un jour (sinon d'après ce que je comprends, il sélectionne le lendemain, aussi)? –

Questions connexes