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 calculado
Si las lecturas superan significativamente las escrituras, el patrón calculado reduce la frecuencia de los cálculos. En lugar de asignar la carga de cálculo a cada lectura, la aplicación almacena el valor calculado y lo recalcula según sea necesario. La aplicación puede recalcular el valor con cada escritura que modifique sus datos de origen o como parte de una tarea periódica.
Nota
Con actualizaciones periódicas, no se garantiza que el valor calculado sea exacto en cada lectura. Sin embargo, este enfoque puede justificar la mejora del rendimiento si no se requiere precisión.
Ejemplo
Una aplicación muestra información sobre el visor de películas y los ingresos.
Considere lo siguiente screenings recopilació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 suelen querer saber cuántas personas vieron una película y cuánto dinero generó. En este ejemplo, para sumar num_viewers y revenue, debe realizar una lectura de los cines que proyectaron la película "Reservoir Dogs" y sumar los valores de esos campos. Para evitar realizar este cálculo cada vez que se solicita la información, puede calcular los valores totales y almacenarlos en una colección movies 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 podrían realizarse a intervalos definidos, por ejemplo, cada hora. Los datos de origen en screenings no se ven afectados por las escrituras en la colección movies, por lo que se pueden 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. Siempre que realice los mismos cálculos repetidamente y tenga una alta tasa de lectura-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 automovilística que ejecuta consultas de agregación masivas sobre datos de vehículos y almacena los resultados para mostrarlos durante las siguientes horas hasta que se vuelvan a calcular los datos.
Una empresa de informes de consumo que recopila datos de diversas fuentes para crear listas ordenadas por rango, como la de "100 Gadgets con Mejores Reseñas". Las listas se pueden regenerar periódicamente, mientras que los datos subyacentes se actualizan de forma independiente.