Un ORM de plus dans la jungle des ORM. Ils rendent la conception bien plus propre, et facilitent la modélisation (on modèlise ses objets en même temps que sa base de données, ce qui permet de factoriser les efforts).
En revanche il faut bien surveiller (mais ça c'est toujours vrai) le nombre de requêtes réellement exécutées derrière (et donc disposer de logs ou d'un "mode debug" correct) car on a tendance à oublier un peu vite les risques d'écroulement des perfs si on ne fait pas la bonne requête au bon endroit.
Par exemple (syntaxe tirée de Propel) si on veut récupérer les noms des chats de chaque maître dont on a la liste des IDs, le but étant d'avoir un tableau associatif "nom du maitre" => "nom du chat".
Schéma trivial :
On évitera un
On lui préfèrera (aussi simple) En revanche il faut bien surveiller (mais ça c'est toujours vrai) le nombre de requêtes réellement exécutées derrière (et donc disposer de logs ou d'un "mode debug" correct) car on a tendance à oublier un peu vite les risques d'écroulement des perfs si on ne fait pas la bonne requête au bon endroit.
Par exemple (syntaxe tirée de Propel) si on veut récupérer les noms des chats de chaque maître dont on a la liste des IDs, le but étant d'avoir un tableau associatif "nom du maitre" => "nom du chat".
Schéma trivial :
Code :
maitre:
id: ~
nom: varchar(64)
chat:
id: ~
nom: varchar(64)
maitre_id: ~
On évitera un
Code PHP :
<?php
$chats = array();
foreach ($ids as $id) {
$maitre = MaitrePeer::retrieveByPk($id); // N*1 requête
foreach ($maitre->getChats() as $chat) { // N*1 requête
$chats[$maitre->getNom()][] = $chat->getNom();
}
} // Total : 2*N requête (N étant la taille de $ids)
Code PHP :
<?php
$chats = array();
$maitres = MaitrePeer::retrieveByPks($ids); // 1 requête
foreach ($maitres as $maitre) {
foreach ($maitre->getChats() as $chat) { // N*1 requête
$chats[$maitre->getNom()][] = $chat->getNom();
}
} // Total : N+1 requête (N étant la taille de $ids)