Docs Menu
Docs Home
/ /

Gestionar datos duplicados

Al incrustar datos relacionados en un solo documento, se puede duplicar datos entre dos colecciones. La duplicación de datos permite a la aplicación hacer una query de información relacionada sobre varias entidades en una sola query, mientras separa lógicamente las entidades en el modelo.

Una preocupación con la duplicación de datos es el aumento de los costos de almacenamiento. Sin embargo, los beneficios de optimizar los patrones de acceso generalmente superan los posibles aumentos de costos derivados del almacenamiento.

Antes de duplicar datos, considere los siguientes factores:

  • El beneficio del rendimiento de las lecturas cuando los datos están duplicados. La duplicación de datos puede eliminar la necesidad de realizar uniones entre varias colecciones, lo que puede mejorar el rendimiento de la aplicación.

  • Frecuencia con la que se deben actualizar los datos duplicados. La lógica adicional necesaria para gestionar actualizaciones poco frecuentes es menos costosa que realizar uniones (búsquedas) en operaciones de lectura. Sin embargo, actualizar frecuentemente los datos duplicados puede generar cargas de trabajo elevadas y problemas de rendimiento.

El siguiente ejemplo muestra cómo duplicar datos en un esquema de aplicación de comercio electrónico para mejorar el acceso y el rendimiento de los datos.

1
use eCommerce
2

Cree las siguientes colecciones en la base de datos eCommerce:

Nombre de colección
Descripción
Documento de muestra

customers

Almacena información del cliente, como nombre, correo electrónico y número de teléfono.

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

products

Almacena información del producto, como precio, tamaño y material.

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

orders

Almacena información del pedido, como la fecha y el precio total. Los documentos de la colección orders incorporan los productos correspondientes a ese pedido en el 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"
}
]
} )

Las siguientes propiedades de la colección products están duplicadas en la colección orders:

  • productId

  • product

  • price

  • size

Cuando la aplicación muestra la información del pedido, muestra las líneas de pedido correspondientes. Si la información del pedido y del producto se almacenaran en colecciones separadas, la aplicación tendría que realizar una $lookup Para unir datos de dos colecciones. Las operaciones de búsqueda suelen ser costosas y tienen un rendimiento bajo.

La razón para duplicar la información del producto, en lugar de solo incrustar líneas de pedido en la colección orders, es que la aplicación solo necesita un subconjunto de información del producto al mostrar los pedidos. Al incrustar solo los campos obligatorios, la aplicación puede almacenar detalles adicionales del producto sin sobrecargar innecesariamente la colección orders.

El siguiente ejemplo utiliza el Patrón de subconjunto para optimizar los patrones de acceso para una tienda en línea.

Considere una aplicación donde, al ver un producto, el usuario muestra su información y las cinco reseñas más recientes. Las reseñas se almacenan en las colecciones products y reviews.

Cuando se escribe una nueva revisión, ocurre lo siguiente:

  • La revisión se inserta en la colección reviews.

  • El arreglo de revisiones recientes en la colección products se actualiza con $pop y $push.

1
use productsAndReviews
2

Cree las siguientes colecciones en la base de datos productsAndReviews:

Nombre de colección
Descripción
Documento de muestra

products

Almacena información del producto. Los documentos de la colección products incorporan las cinco reseñas de producto más recientes en el 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

Almacena todas las reseñas de productos (no solo las recientes). Los documentos de la colección reviews contienen un campo productId que indica el producto al que pertenece la reseña.

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

La aplicación solo necesita realizar una llamada a la base de datos para devolver toda la información que necesita mostrar. Si los datos se almacenaran completamente en colecciones separadas, la aplicación tendría que combinar los datos de las colecciones products y reviews, lo que podría causar problemas de rendimiento.

Las revisiones rara vez se actualizan, por lo que no es costoso almacenar datos duplicados y mantener la consistencia de los datos entre colecciones no es un desafío.

Para aprender cómo mantener la coherencia de los datos duplicados, consulte Consistencia de datos.

Volver

Referencias de bases de datos

En esta página