plusieurs valeurs pour une variable?

Eléphant du PHP | 55 Messages

28 juin 2005, 09:23

Bonjour,

Je cree une base de donnee au sein d une entreprise dans le but de gerer les stocks des differents consommables des imprimantes.
Or j'ai un soucis avec une de mes tables.

j'ai la table :

---------------
Imprimante
---------------
Num_imprimante
imprimante
service --> cle etrangere sur la service
---------------

et la table

--------------
Cartouche
--------------
reference
libelle
prix
stock
compatible
imprimante --> cle etrangere sur le champs imprimante de la table imprimante
--------------

Mon probleme est qu'une cartouche peut aller dans des imprimantes differentes, et je voulais savoir comment faire pour pouvoir declarer plusieur imprimante dans ma table cartouche.

(je sais pas si je suis tres clair)

merci.

-Pour une reference de cartouche il y a au minimum '1' imprimante et au maximum 'n' imprimante.

Je sais bien qu'il n'est pas possible de mettre plusieurs imprimantes dans le champs imprimante. Donc si vous pouviez me dire comment faire (meme si je sais bien que c est la base des SGBD )

Eléphant du PHP | 91 Messages

28 juin 2005, 09:30

au pire dans ton champ imprimante au lieu de faire remonté une clé etrange tu met un tableau comprenant les clés des imprimantes concernées par cette cartouches :

{1,2,3,4} => les imprimantes 1, 2 , 3 et 4 utilisent cette cartouche

mais ton raisonnement n'est pas logique car 1 cartouche ne peut pas se trouver dans plusieurs imprimantes, donc normalement il y aura toujours que 1 clé étrangère
YaTTa :D

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

28 juin 2005, 09:31

quand UNE cartouche peut aller dans PLUSIEURS imprimante, ça donne une relation 1,n

on sort donc le champ qui fait liaison (ici "imprimante" de latable "cartouche") et on fait une relation entre les deux tables

exemple :
imprimantes(Num_imprimante, imprimante, service#);
cartouches(reference,libelle,prix,stock,compatible);
convient(Num_imprimante#,reference#);

édition :
et sans vouloir être désagréable DroP :)
je trouve que c'est une très mauvaise idée de regrouper les numéros car ça annule la puissance du sgbd pour les requêtes ensuite
on ne stocke pas plusieurs informations dans un même champ, on dans plusieurs champs identiques (ex : imprimante1, imprimante2, imprimante3, imprimante4)
si on se retrouve avec ça c'est qu'il y a un petit soucis de conception ;)
Modifié en dernier par ouckileou le 28 juin 2005, 09:34, modifié 1 fois.

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

28 juin 2005, 09:33

Si 1 cartouche peut aller sur 1 à n imprimante et qu'une imprimante peut acceuillir de 1 à n cartouche, il va falloir que tu passe par une table intermédiaire

---------------
Imprimante
---------------
Num_imprimante
imprimante
service --> cle etrangere sur la service
---------------

--------------
lienCartoucheImprimante
--------------
refCartouche --> cle Primaire sur le champ reference de la table cartouche
imprimante --> cle etrangere sur le champs imprimante de la table
--------------

--------------
Cartouche
--------------
reference
libelle
prix
stock
compatible
--------------
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Mammouth du PHP | 19672 Messages

28 juin 2005, 09:39

Pris de vitesse par zeus, j'allais parler aussi de relation car la relation imprimante/cartouche est 1, n/1,n[/code]
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

28 juin 2005, 09:42

pas forcément 1,n/1,n

si UNE imprimante ne peut recevoir qu'UN et UN SEUL modèle de cartouche, alors on pourrait rajouter une clé étrangère vers Num_cartouche dans "Impirmante"

Code : Tout sélectionner

--------------- Imprimante --------------- Num_imprimante imprimante service --> cle etrangere sur la service ref_cartouche --> clé étrangère sur la cartouche --------------- et la table -------------- Cartouche -------------- reference libelle prix stock compatible
Modifié en dernier par ouckileou le 28 juin 2005, 09:42, modifié 1 fois.

Eléphant du PHP | 55 Messages

28 juin 2005, 09:42

@drop :
mais ton raisonnement n'est pas logique car 1 cartouche ne peut pas se trouver dans plusieurs imprimantes, donc normalement il y aura toujours que 1 clé étrangère
si car je ne refechi pas en terme de une cartouche mais en terme de reference de cartouche.

donc une cartouche de reference A peut etre en meme temps dans une imprimante Dell A320 et dans une HP1220c (pur ex)

@zeus,ouckileou

Merci je crois que j ai compris le raisonnement.

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

28 juin 2005, 09:43

Je vois que Cyrano a suivi une formation de conception BdD ...

si on a une relation n/n dans un MCD, le MPD crée une nouvelle table avec une relation 1/n de chaque côté

:roll:
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Eléphant du PHP | 55 Messages

28 juin 2005, 09:45

@ouckileou

pas forcément 1,n/1,n

si UNE imprimante ne peut recevoir qu'UN et UN SEUL modèle de cartouche, alors on pourrait rajouter une clé étrangère vers Num_cartouche dans "Impirmante"

Code:

---------------
Imprimante
---------------
Num_imprimante
imprimante
service --> cle etrangere sur la service
ref_cartouche --> clé étrangère sur la cartouche
---------------

et la table

--------------
Cartouche
--------------
reference
libelle
prix
stock
compatible

oui , mais nan :lol:

car pour les imprimante il y a des cartouche couleurs et des cartouche noires. ;) mais bien pense

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

28 juin 2005, 09:48

ah oui, c'est vrai que c'est mieux comme, sympa de changer toute la cartouche quand le noir est vide sinon :roll:

d'où l'importance du "si" dans mon post :lol:

ça aura moins permis que tu captes l'idée des relations et des cardinalités 1,1/ ou 1,n, car c'est effectivement l'une des bases de la conception ;)

Eléphant du PHP | 55 Messages

28 juin 2005, 09:49

(le probleme c est que j ai peu honte car je suis en formation et que j ai deja vu les MCD en long en large et en travers :cry: )

En tout cas je tenais a tous vous remercier pour votre reactiviter (il y a des post que j ai poste en meme temps sur ce forum et sur d autre dont je n est pas encore une seule reponse et ici le delais pour une reponse ne depasse pas 10 mins)

Donc voila a grand merci et bravo a tout le monde pour ce forum serieux avec des reponses precises et claires.

Mammouth du PHP | 19672 Messages

28 juin 2005, 09:50

Code : Tout sélectionner

Table Imprimante +---------------+-----------+-----+ |id_imprimante | INT| PK| |imprimante |VARCHAR(64)| | +---------------+-----------+-----+ Table Cartouche +---------------+------------+-----+ |id_cartouche | INT | PK| |libelle | VARCHAR(64)| | |prix |DECIMAL(6,2)| | |stock | SMALLINT| | |compatible | ?| | +---------------+------------+-----+ Table correspond +---------------+-----------+-----+ |id_correspond | INT| PK| |id_imprimante | INT| FK| |id_cartouche | INT| FK| +---------------+-----------+-----+
Même s'il y a des cartouches couleurs ou noir ou mixées, ça n'a aucune importance, en ayant une table intermédiaire, tu simplifies et tu peux gérer séparément les imprimantes et les cartouches en ayant quand même les correspondances

Quand tu ajoutes un nouveau type de cartouche, ce nouveau type peut correspondre à différents types d'imprimantes. Même chose dans l'autre sens. En ayant une table "correspond entre les deux, tu vas avoir toutes les combinaisons possibles que tu voudras. Je ne suis pas certain d'arriver à être très clair.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

28 juin 2005, 09:50

pas forcément 1,n/1,n

si UNE imprimante ne peut recevoir qu'UN et UN SEUL modèle de cartouche, alors on pourrait rajouter une clé étrangère vers Num_cartouche dans "Impirmante"

Code : Tout sélectionner

--------------- Imprimante --------------- Num_imprimante imprimante service --> cle etrangere sur la service ref_cartouche --> clé étrangère sur la cartouche --------------- et la table -------------- Cartouche -------------- reference libelle prix stock compatible
Dans ce cas, là, il n'y aura qu'une ligne dans la table intermédaire qui concernera cette imprimante.

Je pense qu'il vaut mieux ça plutôt que de tester si la clé étrangère est vide dans la table imprimante avant d'aller voir dans la table intermédiaire

Surtout que comme il n'y aura pas de grosses cardinalité, on peut se permettre de faire des jointures très facilement et donc de travailler sur une vue plutôt que de jongler entre les tables
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

28 juin 2005, 09:56

Cyrano : il réagissait à ma proposition, qui ne convient pas car une imprimante peut contenir plusieurs cartouches (couleurs/NB)

Zeus : je ne parlais pas de mélanger ET table intermédiaire ET clé étrangère dans imprimante, mais uniquement d'une clé étrangère

quand on a une relation 1,n/1,1, on place une clé étrangère vers la table cible dans la table source
pas besoin de créer une relation si ce n'est que pour avoir une seule ligne dedans

Eléphant du PHP | 55 Messages

28 juin 2005, 09:58

@ cyrano

Dans la table intermediare je suis pas oblige d avoir un id_correspond, si ?

Sinon une autre question la qui me turlupine,
avant dans mon traitement php j'avais reussit a faire (a force de galeres :() des listes deroulantes liees ou quand je selectionais une imprimante la liste deroulante des cartouche en dessous ce mettais a jour tout seule et ne me donnais que cartouche possible pour l imprimante choisie. Or maintenant que je n ai plus la cle etrangere imprimante dans la table cartouche il devenu impossible de retrouver les cartouche possible par imprimante ?