Es besteht eine Eins-zu-wenige-Beziehung, bei der die verknüpften Daten begrenzt, klein und häufig gemeinsam gelesen werden.
→Betten Sie die verknüpften Daten als verschachteltes Objekt oder Array in das Hauptdokument ein.
Warum: Optimiert die Leseleistung durch Abrufen aller notwendigen Daten in einem einzigen Punktlesen, minimiert RU-Kosten und Latenz. Vermeidet clientseitige Joins.
Referenz↗
Eine Eins-zu-viele-Beziehung, bei der die "viele"-Seite unbegrenzt wächst oder unabhängig von der "eins"-Seite aktualisiert wird.
→Speichern Sie verknüpfte Elemente als separate Dokumente und verwenden Sie die ID des übergeordneten Dokuments als Referenz.
Warum: Verhindert, dass Dokumente die 2-MB-Größenbegrenzung überschreiten, und vermeidet hohe RU-Kosten für Aktualisierungen großer eingebetteter Arrays.
Referenz↗
Ein Dokument enthält ein Array, das im Laufe der Zeit unbegrenzt wachsen kann, wodurch das 2-MB-Dokumentgrößenlimit riskiert wird (z. B. Ereignisprotokolle, Kommentare).
→Teilen Sie das Array auf mehrere "Bucket"-Dokumente auf. Wenn ein Bucket einen Größen-/Element-Schwellenwert erreicht, erstellen Sie einen neuen.
Warum: Hält die Größen einzelner Dokumente überschaubar, während die logische Gruppierung verknüpfter Daten beibehalten wird.
Modellierung einer Viele-zu-viele-Beziehung, z. B. Studenten und Kurse oder Artikel und Tags.
→Für begrenzte Beziehungen duplizieren Sie Beziehungsdaten auf beiden Seiten (z. B. Kurs-IDs in Studentendokumenten, Studenten-IDs in Kursdokumenten einbetten). Für unbegrenzte Beziehungen verwenden Sie einen separaten "Join"- oder "Edge"-Dokumentcontainer.
Warum: Denormalisierung optimiert für beide Abfrage-Richtungen (Studenten im Kurs, Kurse für Studenten) ohne Joins. Ein Join-Container ist für unbegrenzte Fälle.
Modellierung hierarchischer Daten (z. B. Organigramm, Produktkategorien) und die Notwendigkeit, alle Nachfolger eines Knotens abzufragen.
→Speichern Sie ein Array aller Vorfahren-IDs oder -Namen (den Pfad) in jedem Dokument.
Warum: Ermöglicht effiziente Unterbaum-Abfragen mit einem einzigen `ARRAY_CONTAINS`-Filter, wodurch kostspielige rekursive Suchen vermieden werden.
Ein Dokument hat ein unbegrenztes Array (z. B. Blogkommentare), aber die häufigste Abfrage benötigt nur die letzten N Elemente.
→Betten Sie eine Untermenge der letzten Elemente in das Hauptdokument ein und speichern Sie alle Elemente als separate referenzierte Dokumente.
Warum: Optimiert den primären Lesepfad für Leistung und Kosten, während bei Bedarf weiterhin der Zugriff auf den vollständigen Datensatz möglich ist.
Speichern einer Sequenz von unveränderlichen Ereignissen für eine Entität und die Notwendigkeit, den aktuellen Zustand oder analytische Aggregate abzufragen.
→Speichern Sie Ereignisse in einem einzigen Container, partitioniert nach der Entitäts-ID. Verwenden Sie Change Feed oder Synapse Link, um materialisierte Ansichten oder Aggregate zu berechnen und zu speichern.
Warum: Bietet einen vollständigen Audit-Trail und entkoppelt das Schreibmodell von verschiedenen Lesemodellen, wodurch hohe Flexibilität geboten wird.
Der Zustand verknüpfter Daten muss zu einem bestimmten Zeitpunkt erhalten bleiben (z. B. die Adresse eines Kunden bei einer Bestellung).
→Betten Sie eine Kopie (Snapshot) der verknüpften Daten in das Dokument ein, anstatt darauf zu verweisen.
Warum: Gewährleistet die historische Genauigkeit, indem das Dokument von zukünftigen Änderungen der referenzierten Daten entkoppelt wird.
Erfassung hochfrequenter Zeitreihendaten (z. B. IoT-Sensormesswerte) und Abfrage nach Geräten über Zeitbereiche hinweg.
→Verwenden Sie die Geräte-ID als Partitionsschlüssel. Aggregieren Sie Messwerte in zeitlich gruppierte Dokumente (z. B. stündlich oder minütlich) anstatt ein Dokument pro Messwert.
Warum: Reduziert die Dokumentanzahl und die Schreib-RUs drastisch, während Daten für effiziente Zeitbereichsabfragen innerhalb einer Partition zusammengelegt werden.
Mehrere Erstell-, Aktualisierungs- oder Löschvorgänge sollen als eine einzige atomare Transaktion ausgeführt werden.
→Verwenden Sie die TransactionalBatch-Funktion des SDK. Alle Operationen müssen denselben logischen Partitionsschlüssel betreffen.
Warum: Bietet ACID-Garantien für bis zu 100 Operationen innerhalb einer einzelnen Partition und stellt sicher, dass entweder alle Operationen erfolgreich sind oder alle zusammen fehlschlagen.
Dokumente sollen nach einem bestimmten Zeitraum (z. B. 30 Tage) automatisch aus einem Container gelöscht werden.
→Aktivieren Sie Time to Live (TTL) im Container und legen Sie den Standardwert für `ttl` in Sekunden fest (z. B. 2592000 für 30 Tage). Ein `ttl` von -1 bei einem einzelnen Dokument überschreibt den Standardwert und verhindert das Ablaufen.
Warum: TTL ist eine kostenlose Funktion, die übrig gebliebene RUs nutzt, um Hintergrundlöschungen durchzuführen, und bietet eine effiziente, wartungsarme Möglichkeit zur Verwaltung des Datenlebenszyklus.
Große binäre Objekte (Bilder, Videos, Dokumente > 2 MB) sollen zusammen mit Cosmos DB-Metadaten gespeichert werden.
→Speichern Sie das binäre Objekt in Azure Blob Storage. Speichern Sie den URI zum Blob im Cosmos DB-Dokument zusammen mit den Metadaten.
Warum: Cosmos DB ist für strukturierte Metadaten optimiert und hat ein Dokumentlimit von 2 MB. Blob Storage ist ein kostengünstiger und skalierbarer Dienst für die Speicherung großer Objekte.