2011-12-19 16 views
5

Estoy tratando de analizar mi mentalidad de RDBMS con Mongoose en una aplicación node.js, y podría usar alguna orientación sobre las mejores prácticas.Esquemas de mangostas/mejores prácticas de consulta (MongoDB, node.js)

Un ejemplo simple: digamos que hay dos colecciones, organizaciones y contactos. Es una relación uno a muchos y ambos necesitan estar solos. Sin embargo, en un método de índice, deseo devolver una matriz de objetos de organización, cada uno con una matriz de objetos de contacto de miembros. (Y luego deseo devolver una matriz de contactos, cada uno con un objeto de organización.)

Me parece que no estoy entendiendo la mejor manera de lograr esto. Aquí están las opciones como las veo hasta ahora:

  1. Incruste contactos con sus identificaciones en los documentos de la organización. La consulta del índice podría ser Organization.find({}, function(err, orgs) { orgs[n].contacts[n]...}). Desventaja: Se necesita mucho espacio de almacenamiento adicional, y debe actualizar los documentos de contacto incrustados cada vez que cambie el documento de contacto "maestro".

  2. Aproveche la estructura populate/DBRef de Mongoose para almacenar identificadores de "clave externa" en ambas tablas. La consulta puede ser: Organization.find({}}.populate('contacts').run(...). Desventaja: Debe almacenar claves en ambos lados.

  3. Vaya a la ruta más tradicional de "clave externa", almacenando solo el id de la organización en un documento de contacto. Consulte los documentos de la organización y luego consulte todos los contactos en la devolución de llamada de la consulta de la organización, combinando los datos en un objeto para devolver. Desventaja: múltiples consultas y sobrecarga de procesamiento adicional (creo que tenemos que encontrar las direcciones y contactos para esas organizaciones de forma independiente y luego iterar sobre cada una, coincidiendo manualmente en el campo _id común, para combinarlas en un nuevo objeto de salida) .

Merece una nueva opción. Algo que permite el esquema de # 3 pero devuelve el objeto combinado deseado con mucho menos sobrecarga.

NOTA: El módulo async parece que podría ayudar con esto, pero ¿es esta la única/la mejor manera?

Respuesta

2

Esto realmente depende de las consultas que va a realizar. - ¿Su sitio depende más de contactos o de organizaciones? - ¿A menudo necesitará mostrar todos los contactos de una organización? - ¿Qué detalles de los contactos necesita para mostrar en una página de la organización?

Etc.

Así que esto realmente depende de las necesidades de su proyecto. ¿Sus organizaciones y contactos están en constante actualización? Si no es así, la duplicación de datos no parece una mala idea, especialmente si su sitio es más leído.

Conclusión: piense en qué páginas tendrá en el sitio y qué tendrán que mostrar esas páginas (por lo tanto, qué consultas deberían realizarse).

+0

Gracias por su respuesta. La aplicación depende igualmente de ambos contactos y organizaciones. Es decir, algunos usuarios se orientan de manera mucho más intensa a orgs, algunos a contactos.En todos los casos, todos los contactos deberían mostrarse para cada organización. En general, habría mayores requisitos de lectura que escritura, pero el espacio de almacenamiento eventualmente sería una preocupación si insertáramos datos de contacto en todos los documentos de la organización. Por ahora, creo que podría tener más sentido seguir con el # 2 ya que mitiga las responsabilidades de los demás. ¡Pero aún parece absurdo almacenar identificadores en ambos lados! – glortho

+0

No es tan malo, solo hace 2 consultas (una para la colección y la otra para los datos a los que se hace referencia). Es la solución más segura para usted en este momento, luego puede cambiar la estructura en el futuro si lo desea. – alessioalex

Cuestiones relacionadas