Acabo de encontrarme con esta pregunta y, aunque es antigua, pensé que sería útil agregar un par de posibilidades que no se mencionan en las respuestas dadas. Además, las cosas se han movido un poco en los últimos años, por lo que vale la pena enfatizar que SQL y NoSQL se están acercando entre sí.
Uno de los comentaristas planteó la sabia actitud de precaución de que "si los datos son relacionales, use relacionales". Sin embargo, ese comentario solo tiene sentido en el mundo relacional, donde los esquemas siempre vienen antes de la aplicación.
MUNDO RELACIONAL: Datos de estructura> Escribir aplicación para obtenerlo
MUNDO NOSQL: Aplicación de diseño> Estructurar datos en consecuencia
Incluso si los datos son relacionales, NoSQL sigue siendo una opción. Por ejemplo, las relaciones uno a muchos no son ningún problema y están ampliamente cubiertas en los documentos de MongoDB
UNA SOLUCIÓN DE 2015 A UN PROBLEMA DE 2010
Desde que se publicó esta pregunta, ha habido intentos serios de acercar noSQL a SQL. El equipo dirigido por Yannis Papakonstantinou de la Universidad de California (San Diego) ha estado trabajando en FORWARD , una implementación de SQL ++ que pronto podría ser la solución a problemas persistentes como el publicado aquí.
En un nivel más práctico, el lanzamiento de Couchbase 4.0 ha significado que, por primera vez, puedes hacer uniones nativas en NoSQL. Usan su propio N1QL. Este es un ejemplo de un JOIN
de sus tutoriales :
SELECT usr.personal_details, orders
FROM users_with_orders usr
USE KEYS "Elinor_33313792"
JOIN orders_with_users orders
ON KEYS ARRAY s.order_id FOR s IN usr.shipped_order_history END
N1QL permite la mayoría de las operaciones SQL, si no todas, incluidas la agregación, el filtrado, etc.
LA SOLUCIÓN HÍBRIDA NO TAN NUEVA
Si MongoDB sigue siendo la única opción, me gustaría volver a mi punto de que la aplicación debe tener prioridad sobre la estructura de los datos. Ninguna de las respuestas menciona la incrustación híbrida, por lo que la mayoría de los datos consultados se incrustan en el documento / objeto, y las referencias se guardan para una minoría de los casos.
Ejemplo: ¿puede esperar información (que no sea el nombre del rol)? ¿Podría el arranque de la aplicación ser más rápido al no solicitar nada que el usuario aún no necesita?
Este podría ser el caso si el usuario inicia sesión y necesita ver todas las opciones para todos los roles a los que pertenece. Sin embargo, el usuario es un "ingeniero" y las opciones para este rol rara vez se usan. Esto significa que la aplicación solo necesita mostrar las opciones para un ingeniero en caso de que quiera hacer clic en ellas.
Esto se puede lograr con un documento que le dice a la aplicación al inicio (1) a qué roles pertenece el usuario y (2) dónde obtener información sobre un evento vinculado a un rol en particular.
{_id: ObjectID(),
roles: [[“Engineer”, “ObjectId()”],
[“Administrator”, “ObjectId()”]]
}
O, mejor aún, indexe el campo role.name en la colección de roles, y es posible que tampoco necesite incrustar ObjectID ().
Otro ejemplo: ¿hay información sobre TODOS los roles solicitados TODO el tiempo?
También podría ser el caso de que el usuario inicie sesión en el tablero y el 90% del tiempo realiza tareas vinculadas a la función de "ingeniero". La incrustación híbrida se puede hacer para ese rol en particular en su totalidad y mantener referencias para el resto únicamente.
{_id: ObjectID(),
roles: [{name: “Engineer”,
property1: value1,
property2: value2
},
[“Administrator”, “ObjectId()”]
]
}
No tener esquemas no es solo una característica de NoSQL, podría ser una ventaja en este caso. Es perfectamente válido anidar diferentes tipos de objetos en la propiedad "Roles" de un objeto de usuario.