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 comenzar
Antes de modificar su esquema para gestionar valores atípicos, considere los pros y los contras del patrón de valores atípicos:
Ventajas
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 los casos límite en la aplicación. Por ejemplo, si tu aplicación normalmente muestra 50 resultados de un arreglo, no habrá un documento que contenga 2,000 resultados que interrumpan la experiencia del usuario.
Contras
El patrón atípico requiere una lógica más compleja para gestionar las actualizaciones. Si necesita actualizar sus datos con frecuencia, podría considerar otros patrones de diseño de esquemas. Para más información, consulta Actualizaciones para Outliers.
Acerca de esta tarea
Considera un esquema que rastrea las ventas de libros. Los documentos típicos en 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.
Suponga que un nuevo libro popular da como resultado un gran número de compras. El diseño actual del esquema da como resultado un documento sobrecargado, lo que tiene un impacto negativo en el rendimiento. Para abordar este problema, implementa el patrón de valores atípicos para documentos que no tienen una cantidad típica de ventas.
Pasos
Identifica un umbral para los valores atípicos.
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.
Decidir cómo gestionar los valores atípicos.
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.
Agrega un indicador para los documentos atípicos.
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 } )
Almacena ventas adicionales en una colección separada.
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" ] } )
Resultados
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.
Considera una página de aplicación que muestra información sobre un libro y todos los usuarios que lo han comprado. Después de implementar el patrón outlier, la página muestra la información de la mayoría de los libros (documentos típicos) rápidamente.
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.
Actualizaciones para valores atípicos
Debes gestionar las actualizaciones de documentos atípicos de manera diferente a los documentos típicos. La lógica que utilizas para realizar actualizaciones depende del diseño de esquema.
Para realizar actualizaciones de valores atípicos para el esquema anterior, implementa la siguiente lógica de aplicación:
Verifica si el documento que se está actualizando tiene
has_extrasconfigurado entrue.Si
has_extrasfalta ofalse, añade las nuevas compras a la colecciónsales.Si el arreglo resultante de
customers_purchasedcontiene más de 50 elementos, ponerhas_extrasentrue.
Si
has_extrasestrue, añade las nuevas compras a la colecciónsales_extraspara elbook_idcorrespondiente.