Page 1 sur 4

plusieurs valeurs pour une variable?

Posté : 28 juin 2005, 09:23
par freebug
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 )

Posté : 28 juin 2005, 09:30
par DroP
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

Posté : 28 juin 2005, 09:31
par ouckileou
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 ;)

Posté : 28 juin 2005, 09:33
par zeus
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
--------------

Posté : 28 juin 2005, 09:39
par Cyrano
Pris de vitesse par zeus, j'allais parler aussi de relation car la relation imprimante/cartouche est 1, n/1,n[/code]

Posté : 28 juin 2005, 09:42
par 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 : 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

Posté : 28 juin 2005, 09:42
par freebug
@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.

Posté : 28 juin 2005, 09:43
par zeus
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:

Posté : 28 juin 2005, 09:45
par freebug
@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

Posté : 28 juin 2005, 09:48
par ouckileou
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 ;)

Posté : 28 juin 2005, 09:49
par freebug
(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.

Posté : 28 juin 2005, 09:50
par Cyrano

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.

Posté : 28 juin 2005, 09:50
par zeus
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

Posté : 28 juin 2005, 09:56
par ouckileou
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

Posté : 28 juin 2005, 09:58
par freebug
@ 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 ?