Bonjour à tous,
Je suis en train de m'intéresser au branchement des objets métiers à une base de données.
Pour commencer simple, voici un petit projet de test avec quelques entités :
Client : Nom, Prénom
Produit : Nom, Description, Quantité dispo, Prix
Commande : Client, Produit, quantité commandée, date
Base de données :
J'aurai 3 tables (j'imagine) possédant les mêmes champs que ci-dessus avec une clé primaire en plus. La table "Commande" elle possèdera deux clés secondaires pointant vers des enregistrements des tables "Client" et "Produit".
Objets
Je vois 3 classes avec les mêmes propriétés que ci-dessus ainsi qu'un identifiant correspondant à la clé primaire de la base de donnée, imposé dans le constructeur.
Donc mon soucis est de brancher mes objets à la base de données.
Voici ma démarche jusqu'ici :
Pour chaque entité, on crée un gestionnaire (GesClients, GesProduits, GesCommandes). Au chargement, les gestionnaires vont récupérer tous les identifiant des objets à charger. Pour chacun d'entre eux, il les crée en spécifiant l'identifiant de référence, et appelle leur méthode "Reload()" pour qu'ils se chargent eux mêmes (un objet étant responsable de lui-même).
Premier problème : Pour 200 clients, ça demande 200 requêtes au lancement de l'application, ça devient coûteux en temps. Est-ce aux gestionnaires à charger toutes les données d'un coup pour les positionner dans les objets ?
Deuxième problème : Est-ce que c'est aux objets métiers de définir les requêtes select, update et insert ? Surtout lorsque je n'ai besoin que du nom (le récupérer ou le mettre à jour) et pas toute la ligne, je ne pense pas que faire une requête par propriété soit une bonne solution.
Troisième problème : Dans la commande, si on veut être souple d'utilisation, on proposera des pointeurs vers le client et le produit plutôt que les identifiants récupérés. Mais pour ça, il faut d'abord avoir chargé ces deux dernières entités avant les commandes.
Quatrième problème : En attribuant un identifiant pour un objet (ou un enregistrement dans la BDD), comment ça va se passer s'il faut charger une table dont la clé primaire est composée de plusieurs clés externes (par exemple j'identifie une commande par le couple Client/Produit)
Cinquième problème : J'utilise un client (par exemple pour l'afficher), je fais donc "GetNom()". Est-ce que c'est à moi à lui demander de se réactualiser avant de lui demander son nom ou est-ce à lui à aller le rechercher auprès de la base ?
Il doit sûrement y avoir des patterns spécifiques à ce genre de problème, mais je ne les connais pas. Je me demande même lorsqu'il y a une source de données je dois stocker les valeurs de mes objets en mémoire ou si je dois systématiquement requêter la source ?
Bref, je suis complètement perdu, auriez-vous des pistes à me donner pour m'éclaircir ?
Merci beaucoup,
A bientôt
Partager