Join us at MongoDB.local London on 7 May to unlock new possibilities for your data. Use WEB50 to save 50%.
Register now >
Docs Menu
Docs Home
/ /
/ / /

Agrupa los datos con el patrón de valores atípicos

Si tu colección almacena documentos de aproximadamente el mismo tamaño y forma, un documento drásticamente diferente (un atípico) puede causar problemas de rendimiento en las common queries.

Considera una colección que almacene un campo de arreglo. Si un documento contiene muchos más elementos de arreglos que otros documentos en la colección, es posible que debas gestionar ese documento de manera diferente en tu esquema.

Utiliza el patrón de atípicos para aislar los documentos que no coinciden con la forma esperada del resto de tu colección. Tu esquema sigue manteniendo todos los mismos datos, pero las consultas comunes no se ven afectadas por un solo documento grande.

Antes de modificar su esquema para gestionar valores atípicos, considere los pros y los contras del patrón de valores atípicos:

El patrón outlier mejora el rendimiento de las consultas ejecutadas con mayor frecuencia. Las consultas que devuelven documentos típicos no necesitan devolver también documentos atípicos de gran tamaño.

El patrón de valores atípicos también gestiona casos extremos en la aplicación. Por ejemplo, si su aplicación suele mostrar resultados 50 de una matriz, no habrá un documento que contenga resultados 2,000 que interrumpan la experiencia del usuario.

El patrón de valores atípicos requiere una lógica más compleja para gestionar las actualizaciones. Si necesita actualizar sus datos con frecuencia, puede considerar otros patrones de diseño de esquemas. Para más información, consulte Actualizaciones para Outliers.

Considere un esquema que rastrea las ventas de libros. Los documentos típicos de la colección se ven así:

db.sales.insertOne(
{
"_id": 1,
"title": "Invisible Cities",
"year": 1972,
"author": "Italo Calvino",
"customers_purchased": [ "user00", "user01", "user02" ]
}
)

La customers_purchased El arreglo es ilimitada, lo que significa que a medida que más clientes compran un libro, el arreglo crece cada vez más. Para la mayoría de los documentos, esto no es un problema porque la tienda no espera más que algunas ventas para un libro en particular.

Supongamos que un libro nuevo y popular genera un gran número de compras. El diseño actual del esquema genera un documento sobrecargado, lo que afecta negativamente al rendimiento. Para solucionar este problema, implemente el patrón de valores atípicos para los documentos que no tienen una cantidad típica de ventas.

1

Dada la estructura típica de documentos de tu esquema, identifica cuándo un documento se convierte en un caso atípico. El umbral puede depender de lo que requiera la Interfaz de Usuario de tu aplicación, o de las queries que ejecutes en tus documentos.

En este ejemplo, un libro con más de 50 ventas se considera un valor atípico.

2

Al tratar grandes arreglos, una forma común de gestionar valores atípicos es almacenar valores más allá del umbral en una colección separada. Para libros que tengan más de 50 ventas, almacena los valores extras customers_purchased en una colección separada.

3

Para libros que tengan más de 50 ventas, añade un nuevo campo de documento llamado has_extras y establece el valor en true. Este campo indica que hay más ventas almacenadas en una colección separada.

db.sales.insertOne(
{
"_id": 2,
"title": "The Wooden Amulet",
"year": 2023,
"author": "Lesley Moreno",
"customers_purchased": [ "user00", "user01", "user02", ... "user49" ],
"has_extras": true
}
)
4

Crea una colección llamada extra_sales para almacenar ventas más allá de las 50 iniciales. Vincula documentos de la colección extra_sales a la colección sales mediante una referencia:

db.extra_sales.insertOne(
{
"book_id": 2,
"customers_purchased_extra": [ "user50", "user51", "user52", ... "user999" ]
}
)

El patrón de valores atípicos impide que documentos atípicos afecten el rendimiento de las query. El esquema resultante evita la existencia de documentos extensos en la colección, al tiempo que mantiene una lista completa de ventas.

Considere una página de aplicación que muestra información sobre un libro y todos los usuarios que lo compraron. Tras implementar el patrón de valores atípicos, la página muestra rápidamente la información de la mayoría de los libros (documentos típicos).

Para libros populares (atípicos), la aplicación realiza una consulta adicional en la colección extra_sales en book_id. Para mejorar el rendimiento de esta consulta, puedes crear un índice en el campo book_id.

Debe gestionar las actualizaciones de los documentos atípicos de forma diferente a la de los documentos típicos. La lógica que utilice para realizar las actualizaciones dependerá del diseño de su esquema.

Para realizar actualizaciones de valores atípicos para el esquema anterior, implementa la siguiente lógica de aplicación:

  • Compruebe si el documento que se está actualizando tiene has_extras establecido en true.

    • Si falta has_extras o false, agregue las nuevas compras a la colección sales.

      • Si el arreglo resultante de customers_purchased contiene más de 50 elementos, poner has_extras en true.

    • Si has_extras es true, agregue las nuevas compras a la colección sales_extras para el book_id correspondiente.

  • Agrupar datos con el patrón de cubo

  • Evitar el arreglo ilimitado

  • Datos relacionados con enlaces

  • Almacenar datos calculados

Volver

Patrón de Bucket

Obtén una insignia de habilidad

¡Domina gratis la “Optimización del diseño de esquemas”!

Más información

En esta página