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

MongoDB:Benutzer in Kommentare eingebettet

Sie können N+1 vermeiden -Problem mit Hunderten von Anfragen mit $in -Abfragen. Bedenken Sie Folgendes:

Post {
  PosterId: ObjectId
  Text: string
  Comments: [ObjectId, ObjectId, ...] // option 1
}

Comment {
  PostId: ObjectId // option 2 (better)
  Created: dateTime,
  AuthorName: string,
  AuthorId: ObjectId,
  Text: string
}

Jetzt können Sie die Kommentare der Beiträge mit einem $in finden Abfrage, und Sie können auch leicht alle Kommentare eines bestimmten Autors finden.

Natürlich könnten Sie die Kommentare auch als eingebettetes Array in post speichern und ein $in ausführen Abfrage der Benutzerinformationen beim Abrufen der Kommentare. Auf diese Weise müssen Sie keine Benutzernamen denormalisieren und benötigen trotzdem nicht Hunderte von Abfragen.

Wenn Sie sich dafür entscheiden, die Benutzernamen zu denormalisieren, müssen Sie alle jemals von diesem Benutzer gemachten Kommentare aktualisieren, wenn ein Benutzer z. sein Name. Auf der anderen Seite, wenn solche Operationen nicht sehr oft vorkommen, sollte es keine große Sache sein. Oder vielleicht ist es sogar besser, den Namen zu speichern, den der Benutzer hatte, als er den Kommentar abgegeben hat, je nach Ihren Anforderungen.

Ein allgemeines Problem beim Einbetten ist, dass verschiedene Writer schreiben in dasselbe Objekt , also müssen Sie die atomaren Modifikatoren verwenden (z. B. $push ). Dies ist manchmal schwieriger mit Mappern zu verwenden (ich kenne Mongoalchemie jedoch nicht) und im Allgemeinen weniger flexibel.