El rendimiento es uno de los aspectos más importantes a tener en cuenta cuando se desarrollan aplicaciones web. Analizar cómo se obtienen los datos de una base de datos es un buen punto de partida a la hora de buscar mejoras. En este artículo, encontrarás ejemplos sobre cómo mejorar el rendimiento utilizando funciones agregadas y filtrando datos a nivel de base de datos.
Un poco de contexto para empezar
Este artículo está inspirado en un problema real que se me planteó una vez. Resolverlo me enseñó mucho, y aún lo tengo como referencia en mi mente. Creo que los ejemplos son un buen recurso de aprendizaje, pueden aclarar muchas cosas. En este artículo, me gustaría compartir contigo algunos ejemplos de uso de los métodos de consulta de Active Record.
Para no introducir detalles específicos del dominio, utilizaré una aplicación de ejemplo de una biblioteca para ilustrar los ejemplos. Todo es bastante sencillo, como se muestra en el diagrama siguiente. Tenemos cuatro tablas: autores, libros, usuarios y alquileres. Un usuario puede tomar prestados muchos libros y un libro puede ser tomado prestado por muchos usuarios, por lo que necesitamos una tabla de unión para modelar las relaciones de muchos a muchos. En nuestro caso, es la tabla de alquileres. También almacenamos información adicional, como las fechas de préstamo y devolución. Un autor puede tener muchos libros asignados a su nombre. Un libro también tiene un atributo que define su género.
Estadísticas de lectura de los usuarios
La tarea consistía en preparar estadísticas para un único usuario, de modo que pudiéramos saber cuántos libros de cada género se habían prestado. Lo primero que se me ocurrió fue obtener todos los libros prestados por el usuario, agruparlos por géneros y luego hacer el mapeo, de forma que cada género tuviera asignado un número de libros en lugar de una lista. Esto es lo que se me ocurrió:
Aunque este enfoque funciona y tiene un aspecto limpio, no utiliza todas las posibilidades que ofrecen los métodos de consulta de Active Record. Gracias a ellos, podemos filtrar y agregar datos a nivel de base de datos sin utilizar SQL sin procesar directamente en nuestra aplicación. código. Operar a nivel db también aumenta nuestra eficacia.
En el ejemplo anterior, podemos utilizar el método group en lugar del grupo de Rubypor método. Se aplicará el GRUPOBY a la consulta tSQL. Además, el método de asignación y tamaño puede sustituirse por una función de agregación de recuento. Al final, nos queda una consulta con el siguiente aspecto:
A continuación encontrarás otras formas de utilizar los métodos de consulta que considero que merece la pena conocer.
Invitación para usuarios inactivos
TAREA: Filtrar los usuarios que nunca han prestado un libro o lo hicieron hace más de un año.
Podríamos obtener todos los usuarios incluyendo los alquileres asociados y luego filtrarlos utilizando el método select.
User.includes(:alquileres).select do |usuario|
user.rentals.empty? || user.rentals.none? { |rental| rental.start_date >= Date.today - 1.year }
end
Pero, por supuesto, no hay necesidad de obtener todo. Utilizando los métodos de consulta, podemos filtrarlo a nivel de base de datos. En primer lugar, vamos a seleccionar los usuarios que han prestado algunos libros en el último año y luego excluirlos de la selección final.
TAREA: Conseguir autores con uno o cero libros prestados
Hacerlo con el método select es super sencillo, pero de nuevo - no hay necesidad de operar sobre un conjunto tan grande de datos ya que la db puede filtrarlos por nosotros:
Es importante recordar una cosa al utilizar left_joins (y outer joins en general). Si hay registros en la tabla izquierda (aquí: autores) que no tienen registros correspondientes en la tabla derecha (aquí: libros), las columnas de la tabla derecha se rellenarán con valores nulos.
Como también necesitamos autores con un libro asignado en el sistema, hay que hacer algunas operaciones más. Tendremos que agrupar, contar y añadir una condición. A continuación te explicamos cómo montarlo todo:
La condición viene después de la función de agregación, por lo que tenemos que utilizar la cláusula HAVING, en lugar de la cláusula WHERE para especificarla.
Merece la pena comprobar los métodos de consulta de Active Record cuando se piensa en el rendimiento de la aplicación. Pueden simplificar tu código y hacer que funcione más rápido. Espero que los ejemplos compartidos te ayuden a explorar las posibilidades que ofrecen los métodos de consulta.