Overview
A menudo, una aplicación necesita derivar un valor a partir de datos fuente almacenados en una base de datos. Calcular un nuevo valor puede requerir recursos significativos de CPU, especialmente en el caso de grandes conjuntos de datos o en situaciones donde se deben examinar múltiples documentos.
Si se solicita un valor calculado con frecuencia, puede ser más eficiente guardarlo en la base de datos con antelación. De esta forma, cuando la aplicación solicita datos, solo se requiere una operación de lectura.
Patrón computado
Si tus lecturas superan significativamente a tus escrituras, el patrón calculado reduce la frecuencia con la que tienes que realizar cálculos. En lugar de cargar con el peso del cálculo cada operación de lectura, la aplicación almacena el valor calculado y lo recalcula según sea necesario. La aplicación puede volver a calcular el valor cada vez que se guarda que modifique los datos de origen del valor calculado, o como parte de una tarea periódica.
Nota
Con actualizaciones periódicas, no se garantiza que el valor calculado sea exacto en una lectura determinada. Sin embargo, este enfoque puede valer la pena el aumento de rendimiento si la precisión exacta no es un requisito.
Ejemplo
Una aplicación muestra información sobre los espectadores y la ganancia de películas.
Considere lo siguiente screenings colección:
db.screenings.insertMany( [ { theater : "Alger Cinema", location : "Lakeview, OR", movie_title : "Reservoir Dogs", num_viewers : 344, revenue : 3440 }, { theater : "City Cinema", location : "New York, NY", movie_title : "Reservoir Dogs", num_viewers : 1496, revenue : 22440 }, { theater : "Overland Park Cinema", location : "Boise, ID", movie_title : "Reservoir Dogs", num_viewers : 760, revenue : 7600 } ] )
Los usuarios a menudo desean saber cuántas personas vieron una determinada película y cuánto dinero recaudó esa película. En este ejemplo, para sumar num_viewers y revenue, debes realizar una consulta para los cines que proyectaron una película con el título “Reservoir Dogs” y sumar los valores de esos campos. Para evitar realizar ese cálculo cada vez que se solicite la información, puedes calcular los valores totales y almacenarlos en una colección movies junto con el propio registro de la película:
db.movies.insertOne( [ { title : "Reservoir Dogs", total_viewers : 2600, total_revenue : 33480, ... } ] )
En un entorno de baja escritura, el cálculo podría realizarse junto con cualquier actualización de los datos screenings.
En un entorno con escrituras más regulares, los cálculos pueden realizarse en intervalos definidos, por ejemplo, cada hora. Los datos fuente en screenings no se ven afectados por los guardados en la colección movies, por lo que puedes ejecutar cálculos en cualquier momento.
Este es un patrón de diseño común que reduce la carga de trabajo de la CPU y aumenta el rendimiento de la aplicación. Cada vez que esté realizando los mismos cálculos repetidamente y tenga una alta proporción de lectura a escritura, considere el Patrón Computado.
Otros casos de uso de muestra
Además de los casos en los que se solicita la suma con frecuencia, como al obtener los ingresos totales o los espectadores en el ejemplo de la base de datos de películas, el patrón calculado es ideal cuando es necesario realizar cálculos con los datos. Por ejemplo:
Una empresa automotriz que ejecuta consultas de agregación masiva sobre los datos de los vehículos, almacenando resultados durante las siguientes horas hasta que los datos se vuelvan a computar.
Una empresa de informes de consumo que recopila datos de diversas fuentes para crear listas ordenadas por rango, como la de los "100 dispositivos mejor valorados". Las listas se pueden regenerar periódicamente, mientras que los datos subyacentes se actualizan de forma independiente.