2012-02-10 4 views
5

J'essaye actuellement d'implémenter des interactions d'utilisateur de type Tumblr, comme reblog, following, followers, commentant, blogues de personnes que je suis actuellement en train de suivre, etc. De plus, il y a une obligation d'affichage de l'activité pour chaque article de blog.Un moyen efficace de créer des relations avec la base de données NoSQL

Je suis coincé avec la création d'un schéma approprié pour la base de données. Il existe plusieurs façons d'obtenir ce type de fonctionnalités (définition de structures de données intégrées comme des billets de blog et des commentaires, création d'un document d'activité pour chaque action, etc.) mais je ne peux pas décider quelle est la meilleure performance et évolutivité.

Par exemple, regardons la mise en œuvre des personnes que je suis. Voici un exemple de document utilisateur.

User = { id: Integer, 
     username: String, 
     following: Array of Users, 
     followers: Array of Users, 
     } 

Cela semble trivial. Je peux gérer le champ suivant par action de l'utilisateur (suivre/ne pas suivre) mais que faire si un utilisateur que je suis actuellement est supprimé. Est-il efficace de mettre à jour tous les enregistrements d'utilisateurs qui suivent un utilisateur supprimé.

Un autre problème est de créer une vue de blog de personnes que je suis.

Post = { id: Integer, 
      author: User, 
      body: Text, 
     } 

Ainsi est-il question efficace derniers messages comme;

db.posts.find({ author: { $in : me.followers} }) 

Répondre

0

Une approche qui fonctionne est appelée "Star Schema". Si vous recherchez sur le web ou wikipedia, vous trouverez beaucoup d'informations.

3

Il me semble que vous essayez d'utiliser un seul magasin de données (dans ce cas, une base de données NoSQL orientée document) pour remplir (au moins) deux exigences différentes. La première chose que vous essayez de faire est de stocker des données dans un magasin orienté document. Je vais supposer que vous avez des raisons légitimes de le faire.

La deuxième chose que vous essayez d'établir est d'établir des relations entre les documents que vous stockez. Votre exemple montre une relation FOLLOWS. Je recommande de traiter cela comme une exigence différente de stocker des données dans une base de données NoSQL orientée document et de chercher à stocker les relations dans une base de données NoSQL orientée graphiquement telle que Neo4j. De cette façon, vos entités peuvent être stockées dans le magasin de documents et les relations dans le magasin de graphes en utilisant uniquement les ID de document. D'après mon expérience, il sera difficile (sinon impossible) d'obtenir une seule base de données NoSQL pour répondre à tous les besoins fonctionnels et non fonctionnels d'une application de taille moyenne à grande. Par exemple, la dernière application sur laquelle je travaille utilise MongoDB, Redis et Neo4j en plus d'un SGBDR. J'ai passé beaucoup de temps à expérimenter avec les technologies et j'ai choisi cette combinaison. Je me suis engagé à utiliser Spring 3, avec le projet Spring Data et jusqu'à présent, mon expérience a été formidable.

+0

Merci pour votre aimable réponse. J'utilise vraiment MongoDB qui convient très bien à Node.js. Je ne veux pas utiliser d'autre technologie (parce que je dois l'apprendre et faire face à d'autres problèmes aussi bien) que si elle peut être implémentée en utilisant efficacement MongoDB. –

+0

Je peux certainement voir la tentation de continuer à essayer d'utiliser MongoDB pour maintenir des relations de document craignant qu'une autre technologie ne crée plus de complexités. Cependant, à mon avis, il s'agira d'une solution non scalable, sauf si l'application en question est très petite et sera toujours maintenue par un seul développeur. À mesure que le nombre de développeurs de l'équipe augmentera, chacun devra comprendre les implications de la mise à jour et de la suppression de documents sur les relations de document. À long terme, cela ne fera que causer plus d'erreurs et de complexité. – manish

Questions connexes