-
Lazy loading & BDD
Bonjour,
Comme a mon habitude, j'ai un probleme et je me penche vers vous.
Je dispose d'une table de donnée contenant des produits, qui sont répartis en categories.
En d'autre termes, et pour faire plus claire:
J'ai 2 tables dans ma BDD --> categories et produits. avec une relation de 1 a plusieurs (une categories peut contenir plusieurs produits).
Je me suis rendu compte (grace a fiddler), que lorsque je chargeais mes données. Que "categories" contenait à l'interieur d'elle meme les objets de "produits" et cela est teriblement lourd. J'ai voulu renoncer a importer les deux données de ma BDD (puisque l'une est comprise dans la seconde), mais je me suis soudain confronter a un autre probleme lors de la gestion de mes données cotés clients.
Aujourd'hui un ami m'a conseillé de mettre lazy loading sur false et de voir le resultat. Et la, comme par miracle il ne m'a pas telecharger touts les produits qui étaient liés a la table de categorie.
Seleument il n'a pas su m'expliquer ce que faisait ce lazy loading. Je n'ai pas vu quelque chose de claire sur le net.
Pour l'instant j'ai tout mis en lazy loading et je me demande si ca me ferra des problemes par la suite.
Merci a vous :ccool:
-
Le lazy-loading est un postulat du moindre effort. Il peut s'avérer efficace comme désastreux selon les scénarios.
Imaginons une entité Bonhomme qui contient une propriété de type List<Voitures>.
Avec le lazy loading, si je demande un bonhomme, seul ce bonhomme sera rapatrié de la base, pas ses voitures. Cependant, si a un moment j'essaie d'accéder à une voiture du bonhomme, la reqûete sera effectuée automatiquement.
C'est super hein? Mais alors, pourquoi ne l'utilises t-on pas tout le temps?
Eh bien c'est simple: c'est le problème du n+1!
Imaginons que cette fois je travaille avec une collection de bonhommes (admettons 1000), toujours en lazy loading, si je fais une boucle qui parcoure ces bonhommes et que je veux voir les voitures du bonhomme: la requête est effectuée en base pour CE bonhomme uniquement! Résultat, si j'itère 1000fois, j'ai 1000+1 requêtes: une fois tous les bonhommes et 1000fois pour les voitures de chacun.
Dans ce cas de figure, il est preferable de précharger les voitures en faisant un truc qui ressemble à :
Code:
var bonhommes = EfContext.Bonhommes.Include("Voitures").ToList();
Les bonhommes et leurs voitures seront chargés en une requête!
-
Pour faire simple, le lazy loading consiste simplement à différer le chargement d'un objet au moment où il est demandé.
En l’espèce, lorsque tu charges tes catégories, tes produits ne sont pas initialisés au chargement des catégories, mais seulement quand tu feras appel aux produits eux-mêmes.
Edit : grilled :)
-
Super ta reponse, merci.
Et pour les autres fonctions du CRUD (Create, Update et Delete). Ca regle aussi le probleme?
Si je dois supprimer un bonhomme par exemple, il me supprime aussi ses voitures?
-
Non! Comme son nom l'indique, le lazy loading est au chargement :)
Le delete en cascade doit se configurer dans la foreign key de la base.
-
Typiquement, le lazy loading s'utilise le plus souvent dans un contexte de vue master/detail.
La master contient par exemple une liste la plus courte possible de "bonhomme" (pr suivre l'exemple) et lorsqu'on choisit un bonhomme, on charge le "bonhomme" complet (avec par exemple entre autres ses voitures) dans la vue détail.
A+