Reforçar a consistência de dados com a incorporação
Se seu esquema armazenar os mesmos dados em várias coleções, você poderá incorporar dados relacionados para remover a duplicação. O esquema atualizado e desnormalizado mantém os dados consistentes ao manter os valores dos dados em um único local.
A incorporação de dados relacionados simplifica seu esquema e garante que o usuário sempre leia os dados mais atuais. No entanto, a incorporação pode não ser a melhor opção para representar relações complexas, por exemplo, relações muitos-para-muitos.
Sobre esta tarefa
Como incorporar dados relacionados de forma otimizada depende das queries executadas pelo seu aplicativo. Ao incorporar dados em uma única coleção, considere os índices que permitem queries de desempenho e estruturam seu esquema para permitir índices lógicos eficientes.
Para comparar os benefícios da incorporação de documentos e referências, consulte Dados incorporados versus referências.
Antes de começar
Analise os diferentes métodos para forçar a consistência dos dados para garantir que a incorporação seja a melhor abordagem para seu aplicativo. Para saber mais, consulte Consistência de dados.
Atualizar a forma como os dados são armazenados em seu banco de dados pode impactar os índices e as consultas existentes. Ao atualizar seu esquema, atualize também os índices e as consultas do seu aplicativo para contabilizar as alterações do esquema.
O exemplo a seguir impõe consistência de dados em um aplicativo de e-commerce. No esquema inicial, as informações do produto são duplicadas na collection products
e sellers
. O campo sellerId
na collection products
é uma referência à collection sellers
e vincula os dados entre si.
// products collection [ { _id: 111, sellerId: 456, name: "sweater", price: 30, rating: 4.9, color: "green" }, { _id: 222, sellerId: 456, name: "t-shirt", price: 10, rating: 4.2, color: "blue" }, { _id: 333, sellerId: 456, name: "vest", price: 20, rating: 4.7, color: "red" } ]
// sellers collection [ { _id: 456, name: "Cool Clothes Co", location: { address: "21643 Andreane Shores", state: "Ohio", country: "United States" }, phone: "567-555-0105", products: [ { id: 111, name: "sweater", price: 30 }, { id: 222, name: "t-shirt", price: 10 }, { id: 333 name: "vest", price: 20 } ] } ]
Passos
Para desnormalizar o esquema e forçar a consistência, incorpore as informações do produto dentro da coleção sellers
:
db.sellers.insertOne( { _id: 456, name: "Cool Clothes Co", location: { address: "21643 Andreane Shores", state: "Ohio", country: "United States" }, phone: "567-555-0105", products: [ { id: 111, name: "sweater", price: 30, rating: 4.9, color: "green" }, { id: 222, name: "t-shirt", price: 10, rating: 4.2, color: "blue" }, { id: 333, name: "vest", price: 20, rating: 4.7, color: "red" } ] } )
Resultados
O esquema atualizado retorna todas as informações do produto quando um usuário faz uma query a um vendedor específico. O esquema atualizado não requer lógica ou manutenção adicionais para manter os dados consistentes, pois os dados são desnormalizados em uma única coleção.
Próximos passos
Depois de reestruturar o esquema, você pode criar índices para oferecer suporte a queries comuns. Por exemplo, se os usuários costumam consultar produtos por cor, você pode criar um índice no campo products.color
:
db.sellers.createIndex( { "products.color": 1 } )