Existe una relación de uno a pocos donde los datos relacionados son acotados, pequeños y se leen con frecuencia juntos.
→Incrustar los datos relacionados como un objeto o matriz anidada dentro del documento principal.
Por qué: Optimiza el rendimiento de lectura al recuperar todos los datos necesarios en una única lectura de punto, minimizando el costo de RU y la latencia. Evita uniones del lado del cliente.
Referencia↗
Una relación de uno a muchos donde el lado "muchos" crece ilimitadamente o se actualiza independientemente del lado "uno".
→Almacenar los elementos relacionados como documentos separados y usar el ID del documento padre como referencia.
Por qué: Evita que los documentos excedan el límite de tamaño de 2 MB y evita altos costos de RU para actualizaciones en grandes matrices incrustadas.
Referencia↗
Un documento contiene una matriz que puede crecer ilimitadamente con el tiempo, lo que arriesga el límite de tamaño de documento de 2 MB (por ejemplo, registros de eventos, comentarios).
→Dividir la matriz entre múltiples documentos de "cubeta". Cuando una cubeta alcanza un umbral de tamaño/elemento, crear una nueva.
Por qué: Mantiene los tamaños de los documentos individuales manejables mientras se mantiene el agrupamiento lógico de los datos relacionados.
Modelar una relación de muchos a muchos, como estudiantes y cursos, o artículos y etiquetas.
→Para relaciones acotadas, duplicar los datos de la relación en ambos lados (por ejemplo, incrustar IDs de cursos en el documento del estudiante, IDs de estudiantes en el documento del curso). Para relaciones no acotadas, usar un contenedor de documentos de "unión" o "borde" separado.
Por qué: La desnormalización optimiza ambas direcciones de consulta (estudiantes en el curso, cursos para el estudiante) sin requerir uniones. Un contenedor de unión es para casos no acotados.
Modelar datos jerárquicos (por ejemplo, organigrama, categorías de productos) y necesitar consultar todos los descendientes de un nodo.
→Almacenar una matriz de todos los IDs o nombres de ancestros (la ruta) en cada documento.
Por qué: Permite consultas eficientes de subárboles con un único filtro `ARRAY_CONTAINS`, evitando búsquedas recursivas costosas.
Un documento tiene una matriz ilimitada (por ejemplo, comentarios de blog), pero la consulta más común solo necesita los N elementos más recientes.
→Incrustar un subconjunto de elementos recientes en el documento principal y almacenar todos los elementos como documentos referenciados separados.
Por qué: Optimiza la ruta de lectura principal para el rendimiento y el costo, al mismo tiempo que permite el acceso al conjunto de datos completo cuando sea necesario.
Almacenar una secuencia de eventos inmutables para una entidad y necesitar consultar el estado actual o agregados analíticos.
→Almacenar eventos en un único contenedor particionado por el ID de la entidad. Usar Change Feed o Synapse Link para calcular y almacenar vistas materializadas o agregados.
Por qué: Proporciona una pista de auditoría completa y desacopla el modelo de escritura de varios modelos de lectura, ofreciendo alta flexibilidad.
Necesidad de preservar el estado de los datos relacionados en un momento específico (por ejemplo, la dirección de un cliente en un pedido).
→Incrustar una copia (instantánea) de los datos relacionados en el documento, en lugar de referenciarlos.
Por qué: Garantiza la precisión histórica al desacoplar el documento de futuros cambios en los datos referenciados.
Ingesta de datos de series temporales de alta frecuencia (por ejemplo, lecturas de sensores IoT) y consulta por dispositivo en rangos de tiempo.
→Usar el ID del dispositivo como clave de partición. Agrupar las lecturas en documentos por cubo de tiempo (por ejemplo, por hora o por minuto) en lugar de un documento por lectura.
Por qué: Reduce drásticamente el recuento de documentos y las RUs de escritura, mientras co-localiza datos para consultas eficientes de rangos de tiempo dentro de una partición.
Necesidad de realizar múltiples operaciones de creación, actualización o eliminación como una única transacción atómica.
→Usar la característica TransactionalBatch del SDK. Todas las operaciones deben apuntar a la misma clave de partición lógica.
Por qué: Proporciona garantías ACID para hasta 100 operaciones dentro de una sola partición, asegurando que todas las operaciones se realicen con éxito o todas fallen juntas.
Los documentos deben eliminarse automáticamente de un contenedor después de un período específico (por ejemplo, 30 días).
→Habilitar Time to Live (TTL) en el contenedor y establecer el valor `ttl` predeterminado en segundos (por ejemplo, 2592000 para 30 días). Un `ttl` de -1 en un documento individual anula el valor predeterminado y evita la expiración.
Por qué: TTL es una característica sin costo que utiliza RUs sobrantes para realizar eliminaciones en segundo plano, proporcionando una forma eficiente y sin intervención para gestionar el ciclo de vida de los datos.
Necesidad de almacenar objetos binarios grandes (imágenes, videos, documentos > 2 MB) asociados con metadatos de Cosmos DB.
→Almacenar el objeto binario en Azure Blob Storage. Almacenar el URI del blob en el documento de Cosmos DB junto con los metadatos.
Por qué: Cosmos DB está optimizado para metadatos estructurados y tiene un límite de documentos de 2 MB. Blob Storage es un servicio rentable y escalable para el almacenamiento de objetos grandes.