MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Comment modéliseriez-vous une relation amicale dans MongoDB ?

MongoDB n'est généralement pas adapté à la modélisation des relations de graphes. Il existe des bases de données de graphes spécialisées qui excellent dans cette tâche.

Cependant, lorsque vous ne souhaitez pas ajouter une autre technologie de base de données au mélange, je vous recommande de créer une nouvelle collection frienships et modélisez chaque relation d'ami comme un document avec un tableau de deux entrées, chacune étant un objet avec les informations abrégées sur l'un des utilisateurs dont vous avez besoin pour afficher une entrée dans vos listes d'amis :

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

La raison de la duplication d'informations à partir des documents d'utilisateurs dans les documents d'amitié est d'éviter une deuxième requête à la collection d'utilisateurs pour obtenir toutes les données pour afficher une liste d'amis d'utilisateurs. MongoDB ne peut pas faire de JOIN peut uniquement effectuer des JOIN sur des collections non partitionnées , vous devez donc éviter de répartir les données dont vous avez besoin pour un cas d'utilisation spécifique sur plusieurs collections, même si cela signifie que vous créez des redondances. Sinon, vous auriez besoin d'effectuer plusieurs requêtes les unes après les autres, ce qui ralentit considérablement le temps de réponse de votre application.

Lorsque vous souhaitez obtenir la liste d'amis de l'utilisateur 123, vous devez effectuer un db.friendships.find({"friendship.id", 123}) (un index sur friendship.id améliorera les performances) et vous recevrez ensuite une liste de documents où Bob est soit le premier, soit le deuxième ami.

Vous itérerez ensuite ces documents et sortirez les informations courtes de l'entrée de tableau qui n'est pas utilisateur 123.

Vous pouvez également filtrer les entrées Bob sur la base de données avec un pipeline d'agrégation. Utilisez la requête $match ci-dessus, $déroulez le tableau d'amitié, puis $matchez les documents dont l'id n'est pas 123. Ce serait un compromis :vous conservez la bande passante au détriment de la charge du processeur sur le serveur de base de données.

Pour demander si une relation d'amitié existe déjà, utilisez :

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