Page 1 sur 1

aidez moi pour ce script merci

Posté : 07 juin 2011, 20:07
par disparados
bonjours,
je suis débutant en php .et je suis entrain de réaliser un site internet pour une pizzeria (commande de pizzas en ligne.) , je voulai créer une base de donnée pour les Pizzas , et je vois pas comment m'y procéder .
je doit stocker touts c'est informations sur une pizza :
-nom
-ingrédients
-taille =(s,d,m,sm)
-prix (dépend de la taille de la pizza)

ma question est ce que je suis obliger de créer 2 table ou la premiére stock le nom ,les ingrédients .

Code : Tout sélectionner

CREATE TABLE pizzas ( id int(6) NOT NULL auto_increment, nom VARCHAR(30) NOT NULL, ingredients text NOT NULL, PRIMARY KEY (id) ) ;
et une qui autre stock la taille et le prix ,par ce que le prix depend de la taille?

Code : Tout sélectionner

CREATE TABLE news ( id int(6) NOT NULL auto_increment, taille VARCHAR(30) NOT NULL, prix int NOT NULL, PRIMARY KEY (id) ) ;
ou je peut mettre tout de la méme table

Code : Tout sélectionner

CREATE TABLE news ( id int(6) NOT NULL auto_increment, nom VARCHAR(30) NOT NULL, ingredients text NOT NULL, taille NOT NULL default , prix VARCHAR NOT NULL, PRIMARY KEY (id) ) TYPE=MyISAM;
j'espére que vous avez compris ma question.merci d'avance

Re: aidez moi pour ce script merci

Posté : 07 juin 2011, 21:58
par moogli
salut,

ton idée est bonne mais elle induit des doublons qui ne sont pas terrible (par exemple 3 tailles d'une même pizza va faire 3 fois les ingredients de la compos

pour respecter les formes normal (enfin les 3 premières du moins) il te faut 3 tables
-- table indiquant le prix en fonction de la taille :)
CREATE TABLE tailleTarif (
   idtaille int unsigned NOT NULL auto_increment,
   taille VARCHAR(30) NOT NULL,
   prix  int NOT NULL,
   PRIMARY KEY  (idtaille)
)engine=innodb; 

CREATE TABLE pizzas (
   id int unsigned NOT NULL auto_increment,
   nom VARCHAR(30) NOT NULL,
   ingredients text NOT NULL,
   PRIMARY KEY  (id)
)engine=innodb;

create table pizzaTaille (
	idtaillepizza int unsigned not null auto_increment,
	idpizza int unsigned not null,
	idtaille int unsigned not null,
	primary key(idtaillepizza),
 index (idtaille),
   foreign key (idtaille)
	references tailleTarif(idtaille)
	on update cascade on delete cascade
)engine=innodb;
Ainsi tu a :
- une table avec les tarifs suivant la taille
- une table avec les compos de la pizza
- une table qui lie les deux premières

le must serais de 5 tables :
CREATE TABLE tailleTarif (
   idtaille int unsigned NOT NULL auto_increment,
   taille VARCHAR(30) NOT NULL,
   prix  int NOT NULL,
   PRIMARY KEY  (idtaille)
)engine=innodb; 
-- Les noms des pizzas
CREATE TABLE pizzas (
   idpizza int unsigned NOT NULL auto_increment,
   nom VARCHAR(30) NOT NULL,
   PRIMARY KEY  (idpizza),
)engine=innodb;
-- Association des pizza et des tailles (donc les tailles possibles pour une pizza)
create table pizzaTaille (
	idtaillepizza int unsigned not null auto_increment,
	idpizza int unsigned not null,
	idtaille int unsigned not null,
	primary key(idtaillepizza),
 index (idtaille),
   foreign key (idtaille)
	references tailleTarif(idtaille)
	on update cascade on delete cascade
)engine=innodb;
-- Les ingredients que l'on peux trouver dans une pizza
create table ingredients (
	idingredient int unsigned not null auto_increment,
	description text not null,
	primary key(idingredient)
)engine=innodb;;

-- Les compos des pizza
create table composPizzas(
	idcompo int unsigned not null auto_increment,
	idpizza int unsigned not null auto_increment,
	idingredient int unsigned  not null,
	primary key (idcompo),
	index (idpizza),
	foreign key (idpizza)
		references pizza(idpizza),
    index (idingredient),
	foreign key (idingredient)
		references ingredients(idingredient)
)engine=innodb;
Ceci bien sur ne tiens pas compte du fait que suivant les ingredients les prix des pizza ne seront pas forcément les mêmes (si tu met du saumon c'est pas le même prix que le jambon :) ).

Comment ça s'articule tous ça ?

c'est en fait simple :
- la table ingredients contient (une seul fois) tous les ingrédients de la cuisine (enfin ceux que l'on veux voir apparaitre sur la carte ;) )
- la table tailleTarif (ça c'est la même que la tienne) elle indique donc le tarif en fonction de la taille
- la table pizzas c'est pour avoir le nom et pourquoi pas la description un p'tit mot etc
- la table pizzaTaille c'est pour faire la liaison entre les trois premières tables,
- la tables composPizza permet d'indiquer la composition de la pizza

Pourquoi 5 tables ?

Simplement pour éviter de répéter plein de fois ma même chose (les ingrédients, les tarifs etc).

Un exemple tu 12 sortes de pizza, avec 3 prix différents pour chaque => 36 ref, tu décide de changer les prix (hausse quelconque) tu doit modifier les 36 tuples a la mano, avec les 5 tables (ou les 3) que trois tuples. les principes est le mêmes pour les ingrédients, ou les compositions (tu change la compo d'une pizza c'est 3 modif la une seule ;) )

plus d'info sur les clefs étrangères => la doc chez mysql la norme SQL sur le sujet

tu aura aussi besoin des jointures


@+