Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 02/03/2007, à 16:17

yohann

question bête: programmation objet et bdd

Bonjour

Je débute en programmation objet (enfin pseudo objet vu que je ne n'ai pas trouver comment créer des variable privées en php, et que je n'utilise pas d'héritage) et je me pose une question vraiment simple à laquelle je ne trouve pas de réponse sur le net : quel lien doit il y avoir entre les propriétées de mon objet et ma base de donnée relationnelle:

Je prend un exemple concret:

J'ai je gère des interventions dans des sociétés,

J'ai donc une table societe et une table intervention,

id_societe
nom_societe

et

id_intervention
libele_intervention
id_societe

j'ai aussi un objet intervention et un objet societe

class intervention
var $id_intervention
var $libele_intervention
var $id_societe

class societe
var $id_societe
var $nom_societe


lorsque j'affiche une intervention il faut que j'affiche aussi le nom de la societe ou à lieu l'intervention.
La question est simple: est il plus correcte de créer var $nom_societe dans la class intervention ou dois-je utiliser l'objet societe dans  mon objet intervention?


en effet utiliser l'objet societe tel quel revient a faire une requete pour trouver le nom de la société pour chaque intervention que j'utilise mais j'utilise un objet déja créé.

D'un autre côté créer une propriéte nom_societe dans mon objet intervention permet de remplir en une seule requete sql le nom de la societe et toutes les propriété de l'intervention.


Cette question me hante a chaque fois que e suis confronté à ce genre de situation (souvent).


quelle est la "bonne" manière de procéder?

merci pour votre aide, le débat est ouvert...


j.vachez, le génie du net | Soirées jeux sur Lyon | 441
++++++++++[>+++++++>++++++++++>+++<<<-]>++.>+.+++++++
..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.

Hors ligne

#2 Le 02/03/2007, à 16:54

Pozzy

Re : question bête: programmation objet et bdd

Je pense que tu devrais plutot faire :

- la table societe
id_societe
nom_societe

- la table intervention
id_intervention
libele_intervention

- la table qui associe une societe à une intervention et vice-versa
id_societe
id_intervention

en effet une societe peut effectuer plusieurs interventions
et une intervention peut etre un service fournit par plusieurs societes

Tu l'a déjà compris, coté php tu implantes une classe qui fait également l'association .

Dernière modification par Pozzy (Le 02/03/2007, à 16:54)

Hors ligne

#3 Le 02/03/2007, à 17:29

yohann

Re : question bête: programmation objet et bdd

merci pour ton aide pozzy mais en fait cela ne m'aide pas: monj analyse du modèle relationnel etant (je pense) bonne en effet la relation qui lie les intervention au société est bien 1-N cad que les intervention sont fournis au société, et une intervention n'a lieu que chez une seule société et plusieurs intervention peuvent avoir lieu chez la même societe.
Je ne me pose donc pas de question a propos de cela.

par contre la question que je me pose encore est:
dois-je créer une propriété nom_societe pour mon objet intervention alors que cette propriété ne dois evidement pas être stocké dans la bdd (pour d'evidentes questions de redondance).

en gros d'une manière générale: est ce que les propriété d'un objet doivent correspondre aux champs de la base de donnée?

en fait je me demande même si je ne me suis pas trompé dès le début de mon objet intervention, c'est à dire que, étant donnée que les intervention sont effectuer chez des sociéte (a une intervention ne correspond qu'une société, à une société correspondent plusieurs intervention)

Mon objet société ne devrait il pas avoir comme propriété non pas cli_id mais carrément un objet client avec toutes ses propriétés?


j.vachez, le génie du net | Soirées jeux sur Lyon | 441
++++++++++[>+++++++>++++++++++>+++<<<-]>++.>+.+++++++
..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.

Hors ligne

#4 Le 02/03/2007, à 17:38

Pozzy

Re : question bête: programmation objet et bdd

Si a une intervention on ne peuxassocier qu'une societe, il clair que ceci est correct

class intervention
var $id_intervention
var $libele_intervention
var $id_societe

class societe
var $id_societe
var $nom_societe

dois-je créer une propriété nom_societe pour mon objet intervention alors que cette propriété ne dois evidement pas être stocké dans la bdd (pour d'evidentes questions de redondance).
en gros d'une manière générale: est ce que les propriété d'un objet doivent correspondre aux champs de la base de donnée?

Il n'est dit nul part que le modele relationnel des bdd, doit etre en bijection avec une implantation suivant le modele objet.
Tu as le droit, d'ailleur tu n'as pas le choix, l'objet intervention doit avoir l'id de la societe parmis ses propriétes.

Hors ligne

#5 Le 02/03/2007, à 17:57

yohann

Re : question bête: programmation objet et bdd

Il n'est dit nul part que le modele relationnel des bdd, doit etre en bijection avec une implantation suivant le modele objet.

Tu as le droit, d'ailleur tu n'as pas le choix, l'objet intervention doit avoir l'id de la societe parmis ses propriétes.

on avance, il est évident que l'id_societe DOIT être présent dans l'objet intervention, je me posais la question par rapport au nom_societe qui est déja présent dans l'objet société et qui faciliterai les chose s'il était aussi présent dans l'objet intervention puisque par exemple si l'objet intervention doit s'afficher, il est interressant qu'il affiche aussi le nom de la société ou l'intervention doit avoir lieu.(ainsi pourquoi pas que quelques autre caractéristique de la société tels que le numéro de tel ou autre)

Donc pour finir je crois qu'a l'avenir je procederais plutôt comme ça: (sauf exeption)

si dans l'analyse relationnel une table a une relation 1-N avec une autre.

Je le traduit en terme d'objet par le fait que l'objet correspond contient en totalité l'objet auquel sa table est lié (bon c'est pas très clair)
un exemple dans mon cas:

class intervention

var id_intervention
var libele_intervention
var societe                               // et pas id_societe

function intervention()          //constructeur
id_intervention = ""
libelle_intervention =""
societe = new societe ();


en gros si une table contient un ID, l'objet correspondant contient tout l'objet correspondant à l'ID.

merci pour ton aide Pozzy, ça fesait un moment que ca me démangeait les méninges par contre j'espère que j'ai juste...


j.vachez, le génie du net | Soirées jeux sur Lyon | 441
++++++++++[>+++++++>++++++++++>+++<<<-]>++.>+.+++++++
..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.

Hors ligne

#6 Le 02/03/2007, à 18:09

Pozzy

Re : question bête: programmation objet et bdd

Avec ce modele, a chaque fois que tu vas créer une intervention , tu vas créer une sociéte.

Or tu a dis plus haut que plusieurs interventions peuvent avoir lieu chez la meme société,
du coup si intervention1 et intervention2 on lieu chez societe1, en créant intervention1 et intervention2 tu vas créer deux objet société pour modéliser une unique société.

Je te conseillerais plutot de stocker que l'id de la societe dans l'objet intervention, et d'équiper ce dernier d'une méthode qui permettrais de récuperer l'objet qui a cet id.

Hors ligne

#7 Le 02/03/2007, à 18:34

yohann

Re : question bête: programmation objet et bdd

ben en fait tu as raison, a chaque fois que j'instancie un objet intervention, j'instancie également l'objet sociéte qui lui est lié.


et bien voila on en retombe sur l'interogation qui me taraude, si c'est mal de faire ça et que je fais ce que tu suggère:

j'ai 1000 intervention et 100 client

je veux afficher la liste de toutes mes intervention et a côté de chaque inter la societe ou se déroule cette dernière:

je commence par une requete pour instancié mes objets intervention genre select * from intervention;

ensuite une petite boucle pour créer mes objet intervention, qui appelle avec la methode de l'objet societe le nom de la société a partir de l'id de la société
total: 1001 requete sql;

sinon a chaque fois que je crée un objet intervention j'instancie aussi un objet socciété:

ma requete devient alors select * from intervention, societe join on société_ID;

même résultat avec 1 seule requete.

c'est pour ça que j'arrive pas à me décider, en fait c'est ce que je voulais expliqué dans mon premier post


j.vachez, le génie du net | Soirées jeux sur Lyon | 441
++++++++++[>+++++++>++++++++++>+++<<<-]>++.>+.+++++++
..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.

Hors ligne

#8 Le 13/03/2007, à 15:36

Sbia

Re : question bête: programmation objet et bdd

Salut yohann en fait tu es devant un problème récurent lors du mapping objet/relationnel.

Ma solution est dictée par les performances que tu veux atteindre dans ton programme et non pas l'élégance absolue du code.

Si tu requete le nom de la société tu va balancer des requêtes à gogo sur ton réseau et ta bd. Pour chaque requête il va refaire le plan d'optimisation (ok y a des caches mais quand même) et controler la syntaxe sql puis relire tous les enregistrements ou index pour trouver ta société. Il faut pas oublier que dans les écritures et lectures disques sont les plus chers en temps de traitement ainsi que l'égorgement de ton réseau.

Donc si tu veux faire une liste ton programme ira plus vite si tu ramènes ton objet société via un join et supporteras mieux la montée en charge. En plus souvent il te faut uniquement l'id et le nom de la société et pas forcément tout le reste de l'objet. Regarde un peu le concept de DTO (Data Transfert Object) c'est interressant.

En espérant que ceci va t'aider un peu.

#9 Le 13/03/2007, à 16:05

yohann

Re : question bête: programmation objet et bdd

merci pour ta réponse qui en fait me conforte dans le choix que j'ai déja fait:
l'objet client peut être construit soit directement a partir d'une requete:

$client = new client(idclient)

soit vierge

$client = new client();

dans ce second cas on utilise une methode

init_from_liste($tableau);

qui va sans faire de requete initialiser l'objet client a partir l'un tableau de valeurs qui provient de la requete avec le JOIN

ça donne un truc genre

while ($tableau=mysql_fetch_array($requete))
{
        client= new client();
        client->init_from_liste($tableau);
        .....

       les trucs à faire sur l'objet tableau
        ......
}

en tout cas merci j'irai me renseigner sur le DTO
et merci pour le vocabulaire mapping objet/relationnel et la confirmation qu'il s'agit là d'un problème récurent.
Enfin je pense la solution que j'ai adoptés est un bon compromis entre propreté du code et efficaté DTO wink même si en terme de propreté absolu c'est un peu faible, je crois qu'il est possible de faire mieux avec du C++ qui permet d'avoir différent constructeur selon le nombre et le type des parametres entrés mais je n'ai pas trouvé comment avoir plusieurs constructeurs pour des objets php

Dernière modification par yohann (Le 13/03/2007, à 16:05)


j.vachez, le génie du net | Soirées jeux sur Lyon | 441
++++++++++[>+++++++>++++++++++>+++<<<-]>++.>+.+++++++
..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.

Hors ligne