Pregunta

¿Qué debería pasar cuando llamo a $ user- > get_email_address () ?

Opción 1: Extraiga la dirección de correo electrónico de la base de datos a pedido

public function get_email_address() {
    if (!$this->email_address) {
        $this->read_from_database('email_address');
    }
    return $this->email_address;
}

Opción 2: Extraiga la dirección de correo electrónico (y los otros atributos de Usuario) de la base de datos en la creación de objetos

public function __construct(..., $id = 0) {
    if ($id) {
        $this->load_all_data_from_db($id);
    }
}

public function get_email_address() {
    return $this->email_address;
}

Mi pregunta básica es si es mejor minimizar la cantidad de consultas a la base de datos o si es mejor minimizar la cantidad de datos que se transfieren desde la base de datos.

Otra posibilidad es que es mejor cargar los atributos que más necesitará / contener la menor cantidad de datos en la creación de objetos y todo lo demás bajo demanda.

Una pregunta de seguimiento: ¿Qué hacen los marcos de abstracción de ORM como Activerecord?

¿Fue útil?

Solución

Realmente no hay una respuesta correcta para esto. Depende de cuántos usuarios esté cargando a la vez, cuántos campos de texto / blob hay en su tabla de Usuario, si su tabla de usuario carga los objetos secundarios asociados. Como dice aaronjensen, este patrón se denomina carga diferida y el comportamiento opuesto (cargar todo por adelantado en caso de que lo necesite) se conoce como carga ansiosa .

Dicho esto, hay una tercera opción que quizás desee considerar, que es la carga lenta de todo el objeto Usuario cuando se accede a cualquiera de sus propiedades:

public function get_email_address() {
    if (!$this->email_address) {
        $this->load_all_data_from_db($this->id)
    }
    return $this->email_address;
}

Las ventajas de este enfoque son que puede crear una colección de usuarios (por ejemplo, una lista de todos los usuarios cuyas contraseñas están en blanco, ¿tal vez?) basándose solo en sus ID, sin el impacto de memoria de cargar completamente a cada usuario, pero luego solo necesita una única llamada a la base de datos para que cada usuario complete el resto de los campos de usuario.

Otros consejos

Minimiza el número de consultas. El número óptimo de consultas es 0, pero si debe realizar una consulta porque no está almacenado en caché, es 1. La consulta de cada propiedad es una forma segura de un sistema que nunca escalará, tiene problemas de contención masivos y causará muchos más dolores de cabeza que vale la pena.

Debo mencionar que la carga diferida tiene un valor (que es de lo que estás hablando en el paso 1) si es poco probable que necesites que los datos se carguen de forma diferida. Sin embargo, si puede, es mejor ser explícito y buscar exactamente o casi exactamente lo que necesita. Cuanto menos tiempo dedique a consultar, menos tiempo estará abierta su conexión y más escalable será su sistema.

Estoy de acuerdo con aaronjensen, excepto cuando la cantidad de datos que está obteniendo es tan grande que comenzará a usar una cantidad excesiva de memoria. Estoy pensando en dónde una fila tiene 3 campos de texto que son bastante grandes y todo lo que quieres es el campo ID.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top