Existe um relacionamento de um para poucos onde os dados relacionados são limitados, pequenos e frequentemente lidos em conjunto.
→Incorporar os dados relacionados como um objeto ou array aninhado dentro do documento principal.
Por quê: Otimiza o desempenho de leitura recuperando todos os dados necessários em uma única leitura pontual, minimizando o custo de RU e a latência. Evita junções (joins) do lado do cliente.
Referência↗
Um relacionamento de um para muitos onde o lado "muitos" cresce ilimitadamente ou é atualizado independentemente do lado "um".
→Armazenar itens relacionados como documentos separados e usar o ID do documento pai como referência.
Por quê: Impede que os documentos excedam o limite de tamanho de 2 MB e evita altos custos de RU para atualizações em grandes arrays incorporados.
Referência↗
Um documento contém um array que pode crescer ilimitadamente ao longo do tempo, arriscando o limite de tamanho de documento de 2 MB (por exemplo, logs de eventos, comentários).
→Dividir o array em vários documentos "bucket". Quando um bucket atinge um limite de tamanho/item, criar um novo.
Por quê: Mantém os tamanhos dos documentos individuais gerenciáveis enquanto preserva o agrupamento lógico dos dados relacionados.
Modelagem de um relacionamento de muitos para muitos, como estudantes e cursos, ou artigos e tags.
→Para relacionamentos limitados, duplicar dados de relacionamento em ambos os lados (por exemplo, incorporar IDs de curso no documento de estudante, IDs de estudante no documento de curso). Para relacionamentos ilimitados, usar um contêiner de documento "join" ou "edge" separado.
Por quê: A desnormalização otimiza para ambas as direções de consulta (estudantes em curso, cursos para estudante) sem exigir joins. Um contêiner de join é para casos ilimitados.
Modelagem de dados hierárquicos (por exemplo, organograma, categorias de produtos) e necessidade de consultar todos os descendentes de um nó.
→Armazenar um array de todos os IDs ou nomes dos ancestrais (o caminho) em cada documento.
Por quê: Permite consultas eficientes de subárvores com um único `ARRAY_CONTAINS` filter, evitando pesquisas recursivas custosas.
Um documento possui um array ilimitado (por exemplo, comentários de blog), mas a consulta mais comum precisa apenas dos N itens mais recentes.
→Incorporar um subconjunto de itens recentes no documento principal e armazenar todos os itens como documentos referenciados separados.
Por quê: Otimiza o caminho de leitura primário para desempenho e custo, enquanto ainda permite o acesso ao conjunto de dados completo quando necessário.
Armazenar uma sequência de eventos imutáveis para uma entidade e precisar consultar o estado atual ou agregados analíticos.
→Armazenar eventos em um único contêiner particionado pelo ID da entidade. Usar Change Feed ou Synapse Link para calcular e armazenar materialized views ou agregados.
Por quê: Fornece um registro de auditoria completo e desacopla o modelo de escrita de vários modelos de leitura, oferecendo alta flexibilidade.
Necessidade de preservar o estado de dados relacionados em um ponto específico no tempo (por exemplo, o endereço de um cliente em um pedido).
→Incorporar uma cópia (snapshot) dos dados relacionados no documento, em vez de referenciá-los.
Por quê: Garante a precisão histórica, desacoplando o documento de futuras alterações nos dados referenciados.
Ingerir dados de séries temporais de alta frequência (por exemplo, leituras de sensores IoT) e consultar por dispositivo em intervalos de tempo.
→Usar o ID do dispositivo como chave de partição. Agregar leituras em documentos agrupados por tempo (por exemplo, por hora ou por minuto) em vez de um documento por leitura.
Por quê: Reduz drasticamente a contagem de documentos e RUs de escrita, enquanto co-localiza dados para consultas eficientes de intervalo de tempo dentro de uma partição.
Necessidade de realizar múltiplas operações de criação, atualização ou exclusão como uma única transação atômica.
→Usar o recurso TransactionalBatch do SDK. Todas as operações devem ter como alvo a mesma chave de partição lógica.
Por quê: Oferece garantias ACID para até 100 operações dentro de uma única partição, garantindo que todas as operações sejam bem-sucedidas ou que todas falhem juntas.
Documentos devem ser automaticamente excluídos de um contêiner após um período específico (por exemplo, 30 dias).
→Habilitar Time to Live (TTL) no contêiner e definir o valor `ttl` padrão em segundos (por exemplo, 2592000 para 30 dias). Um `ttl` de -1 em um documento individual sobrescreve o padrão e impede a expiração.
Por quê: TTL é um recurso sem custo que usa RUs restantes para realizar exclusões em segundo plano, fornecendo uma maneira eficiente e sem intervenção para gerenciar o ciclo de vida dos dados.
Necessidade de armazenar grandes objetos binários (imagens, vídeos, documentos > 2 MB) associados a metadados do Cosmos DB.
→Armazenar o objeto binário no Azure Blob Storage. Armazenar o URI para o blob no documento Cosmos DB junto com os metadados.
Por quê: O Cosmos DB é otimizado para metadados estruturados e tem um limite de documento de 2 MB. O Blob Storage é um serviço escalável e econômico para armazenamento de grandes objetos.