Docs Menu
Docs Home
/ /
/ / /

Datos de grupo con el patrón de valores atípicos

Si su colección almacena documentos que generalmente tienen el mismo tamaño y forma, un documento drásticamente diferente (un valor atípico) puede causar problemas de rendimiento en consultas comunes.

Considere una colección que almacena un campo de matriz. Si un documento contiene muchos más elementos de matriz que otros documentos de la colección, es posible que deba gestionarlo de forma diferente en su esquema.

Utilice el patrón de valores atípicos para aislar del resto de la colección los documentos que no se ajustan a la forma esperada. El esquema conserva los mismos datos, pero las consultas comunes no se ven afectadas por un solo documento grande.

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

El patrón de valores atípicos mejora el rendimiento de las consultas comunes. 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 valores atípicos.

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" ]
}
)

El customers_purchased La matriz es ilimitada, lo que significa que a medida que más clientes compran un libro, la matriz crece. Para la mayoría de los documentos, esto no supone un problema, ya que la tienda solo espera unas pocas ventas de 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 del documento de su esquema, identifique cuándo un documento se convierte en un valor atípico. El umbral puede basarse en las exigencias de la interfaz de usuario de su aplicación o en las consultas que ejecuta en sus documentos.

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

2

Al trabajar con matrices grandes, una forma común de gestionar los valores atípicos es almacenar los valores que superan el umbral en una colección aparte. Para libros con más de 50 ventas, almacene los customers_purchased valores adicionales en una colección aparte.

3

Para los libros con más de 50 ventas, añada un nuevo campo de documento llamado has_extras y asigne el valor true. Este campo indica que hay más ventas almacenadas en una colección independiente.

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

Cree una colección llamada extra_sales para almacenar las ventas posteriores a la 50 inicial. Vincule los documentos de la colección extra_sales con 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 evita que los documentos atípicos afecten el rendimiento de las consultas. El esquema resultante evita documentos grandes en la colección y, al mismo tiempo, 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, implemente 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 la matriz customers_purchased resultante contiene más de 50 elementos, establezca 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 cubo

Obtén una insignia de habilidad

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

Más información

En esta página