Une relation de un à peu existe lorsque les données connexes sont limitées, petites et souvent lues ensemble.
→Intégrer les données connexes en tant qu'objet imbriqué ou tableau au sein du document principal.
Pourquoi: Optimise les performances de lecture en récupérant toutes les données nécessaires en une seule lecture ponctuelle, minimisant ainsi le coût en RU et la latence. Évite les jointures côté client.
Référence↗
Une relation de un à plusieurs où le côté "plusieurs" croît de manière illimitée ou est mis à jour indépendamment du côté "un".
→Stocker les éléments connexes en tant que documents séparés et utiliser l'ID du document parent comme référence.
Pourquoi: Empêche les documents de dépasser la limite de taille de 2 Mo et évite des coûts RU élevés pour les mises à jour sur de grands tableaux intégrés.
Référence↗
Un document contient un tableau qui peut croître de manière illimitée au fil du temps, risquant de dépasser la limite de taille de document de 2 Mo (par exemple, journaux d'événements, commentaires).
→Diviser le tableau entre plusieurs documents "bucket". Lorsqu'un bucket atteint un seuil de taille/d'éléments, en créer un nouveau.
Pourquoi: Maintient la taille des documents individuels gérable tout en conservant le regroupement logique des données connexes.
Modéliser une relation de plusieurs à plusieurs, comme les étudiants et les cours, ou les articles et les balises.
→Pour les relations bornées, dupliquer les données de relation des deux côtés (par exemple, intégrer les ID de cours dans le document étudiant, les ID d'étudiant dans le document de cours). Pour les relations non bornées, utiliser un conteneur de documents "join" ou "edge" séparé.
Pourquoi: La dénormalisation optimise les deux sens de requête (étudiants dans un cours, cours pour un étudiant) sans nécessiter de jointures. Un conteneur de jointure est utilisé pour les cas non bornés.
Modéliser des données hiérarchiques (par exemple, organigramme, catégories de produits) et avoir besoin de rechercher tous les descendants d'un nœud.
→Stocker un tableau de tous les ID ou noms d'ancêtres (le chemin) dans chaque document.
Pourquoi: Permet des requêtes de sous-arborescence efficaces avec un seul filtre `ARRAY_CONTAINS`, évitant les recherches récursives coûteuses.
Un document contient un tableau non borné (par exemple, commentaires de blog), mais la requête la plus courante ne nécessite que les N éléments les plus récents.
→Intégrer un sous-ensemble d'éléments récents dans le document principal et stocker tous les éléments en tant que documents référencés séparés.
Pourquoi: Optimise le chemin de lecture principal pour la performance et le coût, tout en permettant l'accès à l'ensemble complet des données si nécessaire.
Stocker une séquence d'événements immuables pour une entité et avoir besoin de requêter l'état actuel ou les agrégats analytiques.
→Stocker les événements dans un seul conteneur partitionné par l'ID de l'entité. Utiliser le Change Feed ou Synapse Link pour calculer et stocker des vues matérialisées ou des agrégats.
Pourquoi: Fournit une piste d'audit complète et découple le modèle d'écriture de divers modèles de lecture, offrant une grande flexibilité.
Besoin de préserver l'état des données connexes à un moment précis (par exemple, l'adresse d'un client sur une commande).
→Intégrer une copie (snapshot) des données connexes dans le document, plutôt que de les référencer.
Pourquoi: Assure l'exactitude historique en découplant le document des changements futurs des données référencées.
Ingestion de données de séries chronologiques à haute fréquence (par exemple, lectures de capteurs IoT) et interrogation par appareil sur des plages de temps.
→Utiliser l'ID de l'appareil comme clé de partition. Agréger les lectures dans des documents regroupés par temps (par exemple, toutes les heures ou toutes les minutes) au lieu d'un document par lecture.
Pourquoi: Réduit drastiquement le nombre de documents et les RU d'écriture, tout en co-localisant les données pour des requêtes de plage de temps efficaces au sein d'une partition.
Besoin d'effectuer plusieurs opérations de création, de mise à jour ou de suppression en une seule transaction atomique.
→Utiliser la fonctionnalité TransactionalBatch du SDK. Toutes les opérations doivent cibler la même clé de partition logique.
Pourquoi: Fournit des garanties ACID pour jusqu'à 100 opérations au sein d'une seule partition, garantissant que toutes les opérations réussissent ou échouent ensemble.
Les documents doivent être automatiquement supprimés d'un conteneur après une période spécifique (par exemple, 30 jours).
→Activer le Time to Live (TTL) sur le conteneur et définir la valeur `ttl` par défaut en secondes (par exemple, 2592000 pour 30 jours). Un `ttl` de -1 sur un document individuel remplace la valeur par défaut et empêche l'expiration.
Pourquoi: Le TTL est une fonctionnalité sans coût qui utilise les RU restants pour effectuer des suppressions en arrière-plan, offrant un moyen efficace et sans intervention de gérer le cycle de vie des données.
Besoin de stocker de grands objets binaires (images, vidéos, documents > 2 Mo) associés aux métadonnées Cosmos DB.
→Stocker l'objet binaire dans Azure Blob Storage. Stocker l'URI du blob dans le document Cosmos DB avec les métadonnées.
Pourquoi: Cosmos DB est optimisé pour les métadonnées structurées et a une limite de document de 2 Mo. Blob Storage est un service économique et évolutif pour le stockage de grands objets.