Mappage objet-relationnel: quel est le meilleur moyen d'implémenter des getters?

StackOverflow https://stackoverflow.com/questions/169818

  •  05-07-2019
  •  | 
  •  

Question

Que doit-il se passer lorsque j'appelle $ user- > get_email_address () ?

Option 1: extraire l'adresse électronique de la base de données à la demande

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

Option 2: extraire l'adresse électronique (et les autres attributs de l'utilisateur) de la base de données lors de la création de l'objet

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

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

Ma question fondamentale est de savoir s'il est préférable de minimiser le nombre de requêtes dans la base de données ou de réduire le volume de données transférées à partir de la base de données.

Une autre possibilité est qu'il est préférable de charger les attributs dont vous avez le plus besoin / qui contiennent le moins de données lors de la création d'objet et de tout le reste à la demande.

Une question complémentaire: que font les cadres d’abstraction ORM tels que Activerecord?

Était-ce utile?

La solution

Il n’ya vraiment pas de réponse correcte à cela. Dépend du nombre d'utilisateurs que vous chargez en même temps, du nombre de champs texte / blob contenus dans votre table User, que votre table utilisateur charge des objets enfants associés ou non. Comme le dit aaronjensen, ce modèle s'appelle chargement paresseux - et le comportement opposé (chargement de tout juste au cas où vous en auriez besoin) est appelé chargement avec impatience .

Cela dit, vous pouvez envisager une troisième option, qui consiste à charger paresseux tout l'objet User lorsque vous accédez à l'une de ses propriétés:

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

Cette approche présente les avantages suivants: vous pouvez créer une collection d’utilisateurs (par exemple, une liste de tous les utilisateurs dont le mot de passe est vide, peut-être?) en vous basant uniquement sur leurs identifiants, sans avoir à mémoriser le chargement complet de chaque utilisateur. vous n'avez besoin que d'un seul appel à la base de données pour que chaque utilisateur remplisse le reste des champs de l'utilisateur.

Autres conseils

Réduisez le nombre de requêtes. Le nombre optimal de requêtes est 0, mais si vous devez interroger car il n’est pas mis en cache, c’est 1. L’interrogation de chaque propriété est un moyen sûr de parvenir à un système qui ne sera jamais redimensionné, qui aura d’énormes problèmes de conflit et qui causera bien plus de problèmes sa valeur.

Je devrais mentionner que le chargement paresseux a une valeur (c'est ce dont vous parlez à l'étape 1) s'il est peu probable que vous ayez besoin de charger les données paresseusement. Si vous le pouvez, il vaut mieux être explicite et chercher exactement ou presque exactement ce dont vous avez besoin. Moins vous passez de temps à interroger, moins votre connexion est ouverte et plus votre système est évolutif.

Je suis d’accord avec aaronjensen, sauf lorsque la quantité de données que vous extrayez est si importante que vous allez commencer à utiliser une quantité excessive de mémoire. Je pense qu’une rangée contient 3 champs de texte assez grands et que vous ne voulez que le champ ID.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top