2011-01-05 9 views
5

Soy bastante nuevo en MongoDB y NoSQL en general. Tengo una colección Temas, donde cada tema puede tener muchos comentarios. Cada comentario tendrá metadatos y otras cosas que hacen útil una colección de Comentarios.MongoDB: ¿Debería proporcionar identificadores que vinculen con otras colecciones o simplemente incluir colecciones?

En MySQL usaría claves externas para vincular a la tabla Comentarios, pero en NoSQL debería simplemente incluir la colección a Comments dentro de la colección Topics o tenerla en una colección separada y enlazarla con ids?

Gracias! Matt

+0

posible duplicado de [Relaciones de MongoDB para objetos] (http://stackoverflow.com/questions/4253496/mongodb-relationships-for-objects) –

Respuesta

8

Depende.

Depende de la cantidad de cada uno de estos tipos de objetos que esperas tener. ¿Puedes incluirlos a todos en un único documento MongoDB para un tema determinado? Probablemente no.

Depende de las relaciones: ¿tiene relaciones uno a muchos o muchos a muchos? Si es uno-a-muchos y la cantidad de entidades relacionadas es pequeña, puede elegir insertarlas en un IList en un documento. Si es de muchos a muchos, puede optar por utilizar una relación más tradicional o puede elegir incrustar ambos lados como ILists.

Aún puede modelar las relaciones en MongoDB con colecciones separadas PERO no hay uniones en la base de datos, por lo que tiene que hacer eso en el código. Cargar un tema y luego cargar los comentarios podría ser excelente desde una perspectiva de rendimiento.

Otros consejos:

Con MongoDB puede indexar matrices en los documentos. Así que no piense en un índice simplemente como un índice en un campo simple en un documento (como SQL). Puede usar, por ejemplo, una colección de etiquetas en un tema e indexar en las etiquetas. (Consulte http://www.mongodb.org/display/DOCS/Indexes#Indexes-Arrays)

Cuando recupera o escribe datos, puede realizar una lectura parcial y una escritura parcial de cualquier documento. (Consulte http://www.mongodb.org/display/DOCS/Retrieving+a+Subset+of+Fields)

Y, finalmente, cuando no puede ver cómo obtener lo que desea utilizando colecciones e índices, es posible que pueda lograrlo utilizando map reduce. Por ejemplo, para encontrar todas las etiquetas actualmente en uso clasificadas por su frecuencia de uso, asignaría cada Tema que emite las etiquetas utilizadas en él, y luego reduciría ese conjunto para obtener el resultado que desea. A continuación, puede almacenar el resultado de ese mapa reducir de forma permanente y solo actualizarlo cuando lo necesite.

Es un cambio de mentalidad bastante significativo desde el pensamiento relacional, pero vale la pena si necesita la escalabilidad y flexibilidad que ofrece un enfoque NOSQL.

2

Consulte también los documentos de diseño de esquemas (http://www.mongodb.org/display/DOCS/Schema+Design). También hay algunos videos/diapositivas de varias presentaciones de 10Gen sobre el diseño de esquemas vinculados en el sitio de Mongo. Ver http://www.mongodb.org/pages/viewpage.action?pageId=17137769 para una visión general.

Cuestiones relacionadas