51

Tengo dos tablas/colecciones; Usuarios y grupos. Un usuario puede ser miembro de cualquier cantidad de grupos y un usuario también puede ser propietario de cualquier cantidad de grupos. En una base de datos relacional probablemente tenga una tercera tabla llamada UserGroups con una columna UserID, una columna GroupID y una columna IsOwner.Cómo organizar una relación de muchos a muchos en MongoDB

Estoy usando MongoDB y estoy seguro de que hay un enfoque diferente para este tipo de relación en una base de datos de documentos. ¿Debería incrustar la lista de grupos y grupos como propietarios dentro de la tabla Usuarios como dos matrices de ObjectID? ¿Debo también almacenar la lista de miembros y propietarios en la tabla de Grupos como dos matrices, reflejando efectivamente la relación que causa una duplicación de información de relación?

¿O es una tabla de grupos de usuarios un concepto legítimo en las bases de datos de documentos para muchas relaciones?

Gracias

+0

Ver también las respuestas a [esta pregunta] (http://stackoverflow.com/questions/2336700/mongodb-many-to-many-association) y [esta pregunta] (http://stackoverflow.com/questions/ 5498692/many-to-many-relationships-in-couchdb-or-mongodb) –

+0

Sé que esto es bastante antiguo, pero me pregunto también por la escala.¿Qué pasa si tienes 1000 grupos? – FarscapePROJ

+0

Gran punto-- Otra opción, en este caso, es usar el equivalente de una relación de unión de una base de datos SQL, una colección intermedia con dos claves externas, una para cada colección relacionada. En este caso, puede ejecutar 3 consultas: (1) un hallazgo normal() para obtener los resultados principales, (2) una consulta IN para obtener los resultados intermedios y finalmente (3) una consulta IN utilizando las claves externas en el resultados intermedios para encontrar registros de niños. (Así es como implementamos esta función en Waterline) – mikermcneil

Respuesta

34

Lo que he visto hacer, y lo que actualmente utilizo son matrices con la ID de nodo en cada documento incrustado.

Así documentar usuario1 tiene grupos de propiedades: [ID1, ID2]

y documentar el grupo 1 tiene usuarios de la propiedad: [usuario1]. El grupo de documentos2 también tiene usuarios de propiedades: [usuario1].

De esta manera obtiene un objeto de grupo y selecciona fácilmente todos los usuarios relacionados, y lo mismo para el usuario.

Esto requiere un poco más de trabajo al crear y actualizar el objeto. Cuando dice que 2 objetos están relacionados, debe actualizar ambos objetos.

También hay un concepto DBReferences en MongoDB y, dependiendo de su controlador, extraerá los objetos referenciados automáticamente al recuperar un documento.

http://www.mongodb.org/display/DOCS/Database+References#DatabaseReferences-DBRef

+0

Excelente gracias por indicarme los documentos también. Tiene sentido ahora, es un enfoque diferente y más flexible y eficiente. Es emocionante entrar en este tema. También http://www.mongodb.org/display/DOCS/Schema+Design –

+7

Acabo de ver a Kyle Banker responder mi pregunta a los 29 minutos en este video de presentación: http://www.blip.tv/file/3704083. Nunca use una tabla de unión para representar a muchos, en su lugar, tenga una lista de ID de objeto en ambas colecciones –

+8

¿Cómo funciona esta escala? Tener una lista de usuarios en el documento del grupo podría perder el control rápidamente cuando tenga potencialmente miles de usuarios ¿no? – PJH

2

Vamos a entender muchos a muchos Relaciones con un ejemplos

  • libros de autores
  • estudiantes a maestros

Los libros a los autores es una pocos a pocos relación, para que podamos tener una serie de libros o autores dentro del otro docume Nuevo Testamento. Lo mismo aplica para los estudiantes a los maestros. También podríamos incrustarlo a riesgo de duplicación. Sin embargo, esto requerirá que cada estudiante tenga un maestro en el sistema antes de la inserción y viceversa. La lógica de la aplicación siempre puede no permitirlo. En otras palabras, el objeto principal debe existir para que exista el objeto secundario.

Pero cuando tenga relación muchos a muchos, use dos colecciones y tenga un enlace verdadero.

1

En caso de que alguien esté interesado, me topé con un muy buen artículo publicado en el blog mongoDB. 6 Rules of Thumb for MongoDB Schema Design. Hay 3 partes en este artículo, después de leer las 3 tendrás una buena comprensión.

Cuestiones relacionadas