2011-11-01 12 views
13

que tienen dos colecciones:Mongoose: populate()/DBref o duplicación de datos?

  1. Usuarios
  2. Cargas


Cada carga tiene un User asociado a él y necesito saber sus datos cuando un Upload se ve. ¿Es una mejor práctica duplicar estos datos dentro del registro de Cargas, o usar populate() para obtener estos detalles de la colección de Usuarios a la que hace referencia el _id?


OPCIÓN 1

var UploadSchema = new Schema({ 
    _id: { type: Schema.ObjectId }, 
    _user: { type: Schema.ObjectId, ref: 'users'}, 
    title: { type: String }, 
}); 


OPCIÓN 2

var UploadSchema = new Schema({ 
    _id: { type: Schema.ObjectId }, 
    user: { 
      name: { type: String }, 
      email: { type: String }, 
      avatar: { type: String }, 
      //...etc 
      }, 
    title: { type: String }, 
}); 


Con 'Opción 2' si alguno de los datos en los Users cambios de recogida que tendrá para actualizar esto a través de l registros asociados Upload. Con la "Opción 1", por otro lado, puedo relajarme y dejar que populate() asegure que siempre se muestren los últimos datos de usuario.

¿Es importante la sobrecarga de usar populate()? ¿Cuál es la mejor práctica en este escenario común?

Respuesta

16

Si necesita consultar a sus usuarios, mantener a los usuarios solo. Si necesita consultar sus cargas, mantenga las cargas solo.

Otra pregunta que debe hacerse es: ¿Cada vez que necesito estos datos, necesito los objetos incrustados (y viceversa)? ¿Cuántas veces se actualizarán estos datos? ¿Cuántas veces se leerán estos datos?

Piense en una solicitud de amistad: Cada vez que necesite la solicitud que necesita el usuario que hizo la solicitud, luego integrar la solicitud dentro del documento de usuario.

También podrá crear un índice en el objeto incrustado y su búsqueda será mono consulta/rápida/consistente.


Sólo un enlace a mi anterior respuesta en una pregunta similar: Mongo DB relations between objects

Creo que este post va a ser adecuado para usted http://www.mongodb.org/display/DOCS/Schema+Design

Casos de uso

Cliente/orden/orden artículo de línea

Los pedidos deben ser una colección. clientes una colección. los artículos de línea deben ser una matriz de elementos de línea incrustados en el objeto de orden.

Sistema de creación de blogs.

Las publicaciones deben ser una colección. el autor del post puede ser una colección separada, o simplemente un campo dentro de las publicaciones si solo es una dirección de correo electrónico. los comentarios deben ser objetos incrustados dentro de una publicación para el rendimiento.

esquema Fundamentos de Diseño

Kyle Banker, 10gen

http://www.10gen.com/presentation/mongosf2011/schemabasics

Indexación & Optimización de consultas Alvin Richards, Tercera Dir Ector de Empresa Ingeniería

http://www.10gen.com/presentation/mongosf-2011/mongodb-indexing-query-optimization

** Estos 2 videos son las mejores marcas en mongoddb visto nunca en mi humilde opinión *

+0

Entonces, ¿cómo se puede actualizar la fecha duplicada? En el ejemplo de blogging, si estamos duplicando, procedemos de la información de los usuarios (por ejemplo, nombre) en el registro de comentarios de Quick Quaries. Si ese usuario cambia su nombre, debemos actualizar cada instancia de su nombre en la base de datos, en este caso, cada comentario que hayan realizado. – wilsonpage

+0

necesita preguntarse, ¿cuántas veces cambiará su nombre de usuario? tal vez una actualización masiva lo haga en su caso, o simplemente haga un ObjectId al documento del usuario. La incrustación de objetos es una opción, no un mongodb dojo. – kilianc

3

Populate() es solo una consulta. Entonces, la sobrecarga es cualquiera que sea la consulta, que es un find() en su modelo. Además, la mejor práctica para MongoDB es incorporar todo lo que pueda. Conseguirá una consulta más rápida. Sin embargo, parece que estarías duplicando una tonelada de datos, lo que pone las relaciones (enlaces) en un buen lugar.

"Vinculación" es simplemente poner un ObjectId en un campo de otro modelo.

Aquí está el Mongo Buenas Prácticas http://www.mongodb.org/display/DOCS/Schema+Design#SchemaDesign-SummaryofBestPractices

Vinculación/DBRefs http://www.mongodb.org/display/DOCS/Database+References#DatabaseReferences-SimpleDirect%2FManualLinking

+0

Mi esquema es más complicado que esto, sólo se ha simplificado para este ejemplo . Los usuarios pueden ser miembros de múltiples grupos, las Subidas pertenecen al grupo en lugar del usuario. Tu respuesta tampoco responde mi pregunta: "¿Es significativo el costo de usar populate()? ¿Cuál es la mejor práctica en este escenario común?" – wilsonpage

+0

Actualicé mi respuesta para ser más relevante. –

Cuestiones relacionadas