2011-02-06 4 views
4

Je ne fais que commencer avec MongoDB et Mongoid for Rails et j'ai besoin de conseils sur la bonne façon de concevoir une simple base de données de blogs.Conseils sur la structure simple de la base de données MongoDB

J'utilise actuellement la structure ci-dessous, mais j'ai besoin d'un moyen d'interroger tous les commentaires écrits par un utilisateur donné (l'équivalent db relationnel serait Comment.where('user_id = ?', user_id)).

Est-ce la bonne configuration, ou devrais-je déplacer des commentaires dans leur propre document, et ne pas les intégrer dans les messages (comme je le ferais dans un schéma db relationnel)?

Appréciez tout conseil, merci.

Database Schema

post { 
    _id: (object id) 
    title: string 
    body: string 
    user_id: reference 
    comments: [ 
    { _id: (object id), body: string, user_id: reference }, 
    { _id: (object id), body: string, user_id: reference }, 
    ... 
    ] 
} 

user { 
    _id: (object id) 
    name: string 
} 

En MongoDB, mes modèles correspondants sont les suivants:

class Post 
    include Mongoid::Document 
    field :title 
    field :body 
    embeds_many :comments 
    references_one :user 
end 

class Comment 
    include Mongoid::Document 
    field :body 
    embedded_in :post 
    references_one :user 
end 

class User 
    include Mongoid::Document 
    field :name 
    references_many :posts 
end 
+0

Une fois que je posté, StackOverflow vomi [ce poste lié] (http://stackoverflow.com/questions/3813975/ mongo-db-design-embedding-vs-relations) qui fournit une bonne réponse. Toujours être bon d'avoir des opinions sur la meilleure approche si. –

Répondre

3

Il y a un excellent article sur Mongodb.org concernant les différents choix pour la modélisation des commentaires.

Départ: http://www.mongodb.org/display/DOCS/MongoDB+Data+Modeling+and+Rails#MongoDBDataModelingandRails-ModelingComments

+0

Merci. La citation suivante de cette page répond parfaitement à la question: "Il va sans dire que la modélisation des commentaires dans leur propre collection facilite également diverses agrégations à l'échelle du site, y compris l'affichage des derniers résultats, le regroupement par utilisateur, etc. –

1

Vous pouvez utiliser la notation point dans MongoDB pour exécuter les filtres de requête sur les documents incorporés. Dans votre cas, pour récupérer tous les commentaires par un utilisateur, vous pouvez simplement faire:

Post.where("comments.user_id" => myUser.id).all 
Questions connexes