MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Wie würden Sie eine Freundschaftsbeziehung in MongoDB modellieren?

MongoDB eignet sich im Allgemeinen nicht gut für die Modellierung von Graphbeziehungen. Es gibt spezialisierte Graphdatenbanken, die sich für diese Aufgabe auszeichnen.

Wenn Sie dem Mix jedoch keine weitere Datenbanktechnologie hinzufügen möchten, würde ich empfehlen, eine neue Sammlung frienships zu erstellen und modellieren Sie jede Freundschaftsbeziehung als Dokument mit einem Array aus zwei Einträgen, von denen jeder ein Objekt mit den abgekürzten Informationen über einen der Benutzer ist, die Sie benötigen, um einen Eintrag in Ihren Freundeslisten anzuzeigen:

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

Der Grund für das Duplizieren von Informationen aus den Benutzerdokumenten in den Freundschaftsdokumenten besteht darin, eine zweite Abfrage der Benutzersammlung zu vermeiden, um alle Daten zum Anzeigen einer Benutzer-Freundesliste zu erhalten. MongoDB kann keine JOINs durchführen kann JOINs nur für nicht geteilte Sammlungen ausführen , daher sollten Sie es vermeiden, Daten, die Sie für einen bestimmten Anwendungsfall benötigen, auf mehrere Sammlungen zu verteilen, selbst wenn dies bedeutet, dass Sie Redundanzen erstellen. Andernfalls müssten Sie mehrere Abfragen nacheinander ausführen, was die Antwortzeit Ihrer Anwendung erheblich verlangsamt.

Wenn Sie die Freundesliste von Benutzer 123 abrufen möchten, führen Sie einen db.friendships.find({"friendship.id", 123}) aus (ein Index auf friendship.id wird die Leistung verbessern) und dann eine Liste von Dokumenten erhalten, in denen Bob entweder der erste oder der zweite Freund ist.

Sie würden dann diese Dokumente iterieren und die Kurzinfo des Array-Eintrags ausgeben, der nicht ist Benutzer 123.

Alternativ können Sie die Bob-Einträge in der Datenbank mit einer Aggregationspipeline herausfiltern. Verwenden Sie die $match-Abfrage oben, $entwickeln Sie das Freundschafts-Array und $matchen Sie dann die Dokumente, bei denen die ID nicht 123 ist. Dies wäre ein Kompromiss:Sie sparen Bandbreite auf Kosten der CPU-Last auf dem Datenbankserver.

Um abzufragen, ob bereits eine Freundschaftsbeziehung besteht, verwenden Sie:

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