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 comenzar
Antes de modificar su esquema para manejar valores atípicos, considere los pros y contras del patrón de valores atípicos:
Profesionales
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.
Contras
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.
Acerca de esta tarea
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.
Pasos
Identificar un umbral para valores atípicos.
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.
Decidir cómo manejar los valores atípicos.
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.
Añadir un indicador para documentos atípicos.
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 } )
Almacene las ventas adicionales en una colección separada.
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" ] } )
Resultados
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.
Actualizaciones para valores atípicos
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_extrasestablecido entrue.Si falta
has_extrasofalse, agregue las nuevas compras a la colecciónsales.Si la matriz
customers_purchasedresultante contiene más de 50 elementos, establezcahas_extrasentrue.
Si
has_extrasestrue, agregue las nuevas compras a la colecciónsales_extraspara elbook_idcorrespondiente.