Menu Docs
Página inicial do Docs
/
Manual do MongoDB
/

Manipular dados duplicados

Nesta página

  • Sobre esta tarefa
  • Exemplo: dados duplicados em um esquema de comércio eletrônico
  • Passos
  • Benefícios da duplicação de dados
  • Exemplo: dados duplicados para avaliações de produtos
  • Passos
  • Benefícios da duplicação de dados
  • Saiba mais

Ao incorporar dados relacionados em um único documento, você pode duplicar dados entre duas collections. A duplicação de dados permite que o seu aplicativo consulte informações relacionadas a várias entidades em uma única query, separando logicamente as entidades no seu modelo.

Uma preocupação com a duplicação de dados é o aumento dos custos de armazenamento. No entanto, os benefícios da otimização dos padrões de acesso geralmente superam os possíveis aumentos de custos do armazenamento.

Antes de duplicar dados, considere os seguintes fatores:

  • Com que frequência os dados duplicados precisam ser atualizados. A atualização frequente de dados duplicados pode causar cargas de trabalho pesadas e problemas de desempenho. No entanto, a lógica extra necessária para lidar com atualizações pouco frequentes é menos dispendiosa do que a execução de junções (pesquisas) em operações de leitura.

  • O benefício em desempenho das leituras quando os dados estiverem duplicados. A duplicação de dados pode eliminar a necessidade de realizar junções em várias coleções, o que pode melhorar o desempenho do aplicativo.

O exemplo a seguir mostra como duplicar dados em um esquema de aplicativo de comércio eletrônico para melhorar o acesso aos dados e o desempenho.

1
use eCommerce
2

Crie as seguintes coleções no banco de dados eCommerce :

Nome da collection
Descrição
Documento de amostra

customers

Armazena informações do cliente, como nome, e-mail e número de telefone.

db.customers.insertOne( {
customerId: 123,
name: "Alexa Edwards",
email: "a.edwards@randomEmail.com",
phone: "202-555-0183"
} )

products

Armazena informações do produto, como preço, tamanho e material.

db.products.insertOne( {
productId: 456,
product: "sweater",
price: 30,
size: "L",
material: "silk",
manufacturer: "Cool Clothes Co"
} )

orders

Armazena informações do pedido, como data e preço total. Os documentos na coleção orders incorporam os produtos correspondentes desse pedido no campo lineItems .

db.orders.insertOne( {
orderId: 789,
customerId: 123,
totalPrice: 45,
date: ISODate("2023-05-22"),
lineItems: [
{
productId: 456,
product: "sweater",
price: 30,
size: "L"
},
{
productId: 809,
product: "t-shirt",
price: 10,
size: "M"
},
{
productId: 910,
product: "socks",
price: 5,
size: "S"
}
]
} )

As seguintes propriedades da coleção products são duplicadas na coleção orders :

  • productId

  • product

  • price

  • size

Quando o aplicação exibe informações do pedido, ele exibe os itens de linha do pedido correspondente. Se o pedido e as informações do produto fossem armazenados em collections separadas, o aplicação precisaria executar um $lookup para unir dados de duas collections. As operações de pesquisa geralmente são caras e têm desempenho ruim.

A razão para duplicar informações de produto em vez de incorporar apenas itens de linha na coleção orders é que o aplicativo só precisa de um subconjunto de informações de produto ao exibir pedidos. Ao incorporar apenas os campos obrigatórios, o aplicativo pode armazenar detalhes adicionais do produto sem adicionar inchaço desnecessário à coleção orders .

O exemplo a seguir usa opadrão de subconjunto para otimizar padrões de acesso para uma loja online.

Considere um aplicativo em que, quando o usuário visualiza um produto, são exibidas as informações do produto e as cinco avaliações mais recentes. As avaliações são armazenadas em uma coleção products e em uma coleção reviews.

Quando uma nova revisão é escrita, ocorrem as seguintes gravações:

  • A avaliação é inserida na collection reviews .

  • A array de avaliações recentes na coleção products é atualizada com $pop e $push.

1
use productsAndReviews
2

Crie as seguintes coleções no banco de dados productsAndReviews :

Nome da collection
Descrição
Documento de amostra

products

armazena informações do produto. Os documentos da coleção products incorporam as cinco avaliações de produto mais recentes no campo recentReviews.

db.products.insertOne( {
productId: 123,
name: "laptop",
price: 200,
recentReviews: [
{
reviewId: 456,
author: "Pat Simon",
stars: 4,
comment: "Great for schoolwork",
date: ISODate("2023-06-29")
},
{
reviewId: 789,
author: "Edie Short",
stars: 2,
comment: "Not enough RAM",
date: ISODate("2023-06-22")
}
]
} )

reviews

Armazena todas as avaliações de produtos (não apenas avaliações recentes). Os documentos na coleção reviews contêm um campo productId que indica o produto ao qual a revisão se refere.

db.reviews.insertOne( {
reviewId: 456,
productId: 123,
author: "Pat Simon",
stars: 4,
comment: "Great for schoolwork",
date: ISODate("2023-06-29")
} )

O aplicativo só precisa fazer uma chamada para o banco de dados para retornar todas as informações que precisa exibir. Se os dados fossem armazenados inteiramente em coleções separadas, o aplicativo precisaria unir dados da coleção products e reviews, o que poderia causar problemas de desempenho.

As avaliações raramente são atualizadas, portanto, não é caro armazenar dados duplicados e manter os dados consistentes entre as coleções não é um desafio.

Para saber como manter dados duplicados consistentes, consulte Consistência de dados.

Voltar

Fatores operacionais