Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 29-04-2007 20:24:54

Julien
Membre
Date d'inscription: 16-03-2007
Messages: 501

Implémentation du FullLoading avec l'ORM de ZF

Voila encore un petit billet concernant le composant Zend_Db, et plus particulièrement l'ORM.
ZF est en mode LazyLoading, lorsqu'on récupère un résultat, on ne peut résoudre les dépendances implicitement dedans.
Je viens d'écrire un article permettant ceci, il est ici pour les curieux :

http://blog.developpez.com/index.php?bl … 1&pb=1

Je n'ai pas regardé s'il est prévu d'implémenter officiellement un tel mode de chargement dans ZF, mais aux dernières nouvelles, non. Ce mode étant relativement gourmand pour la BDD.

Je le proposerai peut-être une fois qu'il sera finalisé :-)

Hors ligne

 

#2 30-04-2007 12:51:37

fred wolf
Administrateur
Lieu: Bordeaux
Date d'inscription: 09-04-2007
Messages: 96

Re: Implémentation du FullLoading avec l'ORM de ZF

Même si j'ai allégé le code au maximum, ca reste très lourd. Un objet pouvant avoir tout un tat de relations enfouies les unes dans les autres, un simple appel à un jeu de résultat peut envahir la base de données, car la logique SQL n'est pas manipulée, en d'autres termes, on ne fait pas de join(), mais bien d'autres requêtes.

Bonjour Julien,
Bravo pour l'article. Je voudrais revenir sur cette phrase qui le conclut. Pardon de quoter une phrase venant d'un autre site, je ne sais pas si ça se fait.

Je me suis retrouvé récemment dans un cas où j'utilisais la "logique sql" en lançant une requête contenant des joins, au moins 15. A cause des produits cartésiens liés aux relations n à n et 1 à n entre mon entité principale est les autres, je me retrouvais avec plus de 1000 enregistrements pour 1 seule entité principale.
Or pour utiliser ce jeu de résultats, il me fallait le parser pour l'ordonner dans un tableau imbriqué.

J'ai donc opté pour la solution que tu évoques, je lance plusieurs requêtes et construis mon résultat imbriqué directement avec les jeux d'enregistrements retournés, donc plusieurs requêtes mais un parsing minimal des résultats.

Tout est histoire de dosage, qu'est-qui est plus rapide ? Ta méthode est surement préférable dans certains cas à une seule requête utilisant des joins.

On peut en deuxième exercice, instaurer un "level", à savoir, je ne descends pas chercher des relations au dela de X niveaux

Le problème c'est que tu voudras peut-être un niveau X sur une branche et un niveau Y sur une autre branche, non ?
Peut-être, y-aurait-t-il moyen de passer en paramètres des "points d'arrêts" qui feraient référence à ta référenceMap qui stopperaient le traitement récursif quand il sont atteints. Bon, je dis ça c'est peut-être une connerie, je n'y ai pas trop réfléchi, ce qui est sûr c'est que je n'en mourrais pas smile

A bientôt,

fred

P.S : En fait, j'aurais dû poster ce message sur l'autre site, je m'aperçois qu'il est hors sujet ici...

Dernière modification par fred wolf (30-04-2007 12:52:38)

Hors ligne

 

#3 02-05-2007 09:37:03

Julien
Membre
Date d'inscription: 16-03-2007
Messages: 501

Re: Implémentation du FullLoading avec l'ORM de ZF

Mff.
Une jointure, si elle est correctement faite, avec les bons indexs où il faut, est toujours plus rapide que 2 ou plusieurs requêtes séparées.
Parce qu'un requête, c'est ouvrir une connexion, et rien que ca, ca prend un bon bout de temps.
Une jointure se fait sur une seule requête, et donc si elle est bien faite, le moteur du SGBD va préparer son plan d'execution logique et l'executer, et ceci relativement rapidement.

Pour l'histoire du niveau, ca me parait simple à implémenter, mais partout pareil. Un niveau différent par branche est plus complexe à mettre en place, il ne faut pas oublier que le code final doit demeurer pas trop lourd; même si l'idée est bonne smile

Hors ligne

 

#4 02-05-2007 10:10:39

fred wolf
Administrateur
Lieu: Bordeaux
Date d'inscription: 09-04-2007
Messages: 96

Re: Implémentation du FullLoading avec l'ORM de ZF

Mff.
Une jointure, si elle est correctement faite, avec les bons indexs où il faut, est toujours plus rapide que 2 ou plusieurs requêtes séparées.

Là dessus je suis d'accord, ce n'est pas tant le temps de réponse de la requête qui me gêne, c'est le traitement du jeu de résultat.

Dans l'exemple que je cite, je me retrouve avec un millier d'enregistrements pour une seule entité. Mais en l'état, je ne peux rien en faire, il faut que je traite ce résultat, non ?

En fait, l'idéal serait d'obtenir ce jeu de résultat déjà imbriqué (nested).

Ca m'intéresse d'avoir ton (votre) avis là-dessus. J ne me suis jamais penché sur les procédures stockées, serait-ce une solution ?

Fred

Dernière modification par fred wolf (02-05-2007 10:11:39)

Hors ligne

 

#5 02-05-2007 18:57:52

Julien
Membre
Date d'inscription: 16-03-2007
Messages: 501

Re: Implémentation du FullLoading avec l'ORM de ZF

Oui tout à fait, j'ai pas le temps par contre de me jeter là dessus ;-)

De toute façon l'ORM c'est bien, mais dès qu'on part dans de la requête assez personnalisée, faisant intervenir plusieurs tables, avec plusieurs sauts, etc... on l'écrira manuellement avec du JOIN, en sélectionnant bien les bonnes colonnes que l'on souhaite, de manière à préformatter son résultat.

Le résultat que l'on obtiendra sera un "mélange" de 2 tables minimum, il sera donc impossible ensuite d'utiliser l'ORM sans réécrire un bon paquet de code.

l'ORM a bien sa definition : à une table relationnelle, je fais correspondre un objet métier, et sur cette objet, des méthodes de CRUD sont applicables ( find(), save() ... ).
Si on JOIN, nécessairement on croise plusieurs tables, donc l'objet résultant n'aura plus de sens pour l'ORM, il faudra alors créer soit-même sa classe, ses méthodes, et sa logique; ce qui n'est pas très facile selon les cas...

Hors ligne

 

Pied de page des forums

Propulsé par PunBB
© Copyright 2002–2005 Rickard Andersson
Traduction par punbb.fr

Graphisme réalisé par l'agence Rodolphe Eveilleau
Développement par Kitpages