Make the MongoDB docs better! We value your opinion. Share your feedback for a chance to win $100.
Click here >
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 de las preocupaciones al duplicar datos es el aumento de los costos de almacenamiento. Sin embargo, los beneficios de optimizar los patrones de acceso superan en general los posibles aumentos de costos por 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.

  • Con qué frecuencia se deben actualizar los datos duplicados. La lógica extra necesaria para gestionar las actualizaciones poco frecuentes es menos costosa que realizar uniones (búsquedas) en las operaciones de lectura. Sin embargo, la actualización frecuente de datos duplicados puede causar cargas de trabajo pesadas y problemas de rendimiento.

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

1
use eCommerce
2

Crea 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, talla y material.

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

orders

Almacena información de pedidos como la fecha y el precio total. Los documentos en la colección orders integran los productos correspondientes de 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 información de pedido, también muestra los artículos de línea correspondientes de ese pedido. Si la información del pedido y del producto se almacenara en colecciones diferentes, la aplicación necesitaría realizar $lookup para unir datos de dos colecciones. Las operaciones de búsqueda suelen ser costosas y tener un desempeño deficiente.

La razón para duplicar la información de los productos, en lugar de solo incrustar los elementos de la línea en la colección orders, es que la aplicación solo necesita un subconjunto de información de los productos al mostrar las órdenes. Al incrustar únicamente los campos necesarios, la aplicación puede almacenar detalles adicionales del producto sin añadir información innecesaria a la colección orders.

El siguiente ejemplo utiliza el patrón de subconjunto para optimizar los patrones de acceso en una almacenar en linea.

Considera una aplicación en la que, cuando el usuario ve un producto, la aplicación muestra la información del producto y las cinco reseñas más recientes. Las revisiones se almacenan tanto en una colección products como en una colección 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

Crea las siguientes colecciones en la base de datos productsAndReviews:

Nombre de colección
Descripción
Documento de muestra

products

Almacena información sobre el producto. Los documentos en la colección products integran las cinco revisiones de productos 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 revisiones de productos (no solo las recientes). Los documentos en la colección reviews contienen un campo productId que indica el producto al que se refiere la revisión.

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 recuperar toda la información que necesita mostrar. Si los datos se almacenaran completamente en colecciones separadas, la aplicación tendría que combinar 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 caro almacenar datos duplicados y mantener los datos consistentes entre colecciones no supone un desafío.

Para aprender a mantener los datos duplicados coherentes, consulta Coherencia de datos.

Volver

Referencias de bases de datos

En esta página