sql >> Base de Datos >  >> NoSQL >> MongoDB

¿Cómo modelarías una relación de amistad en MongoDB?

MongoDB generalmente no es una buena opción para modelar relaciones de gráficos. Existen bases de datos gráficas especializadas que sobresalen en esta tarea.

Sin embargo, cuando no desee agregar otra tecnología de base de datos a la mezcla, recomendaría crear una nueva colección frienships y modele cada relación de amistad como un documento con una matriz de dos entradas, cada una de ellas un objeto con la información abreviada sobre uno de los usuarios que necesita para mostrar una entrada en sus listas de amigos:

{
    friendship: [
       {
            id:123,
            name: "Bob",
            avatar: "Bob.jpg"
       },
       {
            id:456,
            name: "Alice",
            avatar: "Alice.jpg"
       }
    ]
}

La razón para duplicar la información de los documentos de usuario en los documentos de amistad es evitar una segunda consulta a la colección de usuarios para obtener todos los datos para mostrar una lista de amigos de los usuarios. MongoDB no puede hacer JOIN solo puede realizar JOIN en colecciones no fragmentadas , por lo que debe evitar distribuir los datos que necesita para un caso de uso específico en varias colecciones, incluso cuando eso signifique crear redundancias. De lo contrario, deberá realizar varias consultas una tras otra, lo que ralentiza significativamente el tiempo de respuesta de su aplicación.

Cuando desee obtener la lista de amigos del usuario 123, debe realizar un db.friendships.find({"friendship.id", 123}) (un índice en friendship.id mejorará el rendimiento) y luego recibirá una lista de documentos donde Bob es el primer o el segundo amigo.

Luego, iteraría estos documentos y generaría la información breve de la entrada de matriz que no usuario 123.

Alternativamente, puede filtrar las entradas de Bob en la base de datos con una canalización de agregación. Utilice la consulta de $coincidencia anterior, $desenrolle la matriz de amistad y luego $coincida con los documentos en los que el ID no sea 123. Esto sería una compensación:conserva el ancho de banda a expensas de la carga de la CPU en el servidor de la base de datos.

Para consultar si ya existe una relación de amistad, utilice:

db.friendships.find( { $and: [ 
       { "friendship.id": 123 }, 
       { "friendship.id": 456 } 
    ] } ).count();