[probleme SQL]Clé primaire clé etrangere [Fermé]

Signaler
-
 Sql -
Bonjour,
voila je doit creer un site internet et stocké par exemple mes articles etc dans une table donc j'ai 4tables

une table membres ,articles,horaires,etat civil

membres:
nom
prenom
mot de passe(pour moi clé primaire)
nom d'usage
adresse telephone
e-mail


articles
nombre article
code article
titre
text_article
auteur


horaires
nombre d'office
nom de loffice
heure ouverture
heure fermeture
gerant
telephone

etat civil( pas la peine de l'expliquer car ce sera une partie visible meme au non inscrit )


donc le principe c'est si une personne est inscrite via le site elle peut acceder au horaires et articles mais je ne voi pas trop comment lié les tables
est il possible de prendre par exemple l'attributs mot de passe de membres et le definir a la fois clé etrangere de articles et horaires? je boss actuellement sur easy php donc si vous avez une autre solution pourriez vous m'aider si possible me donner le morceau de la requete correspondant


merci bocoup

8 réponses

Messages postés
21
Date d'inscription
mardi 20 novembre 2007
Statut
Membre
Dernière intervention
10 février 2008
25
bonjour
enfaite t'as 4 entité membres , articles ,horaires ,etat civil ;
chaque entité va etre représenté par une table dans t'as base

la clé primaire d'une table doit étre unique et non null ;

or si tu choisis par exemple dans la table membres le nom d'un membre comme clé primaire
tu risque de violé l'unicité de la clé car 2 membres peuvent avoir le méme nom ; pour eviter ça il faut que tu ajoute un champ dans t'as table membres ,

"idmembre" par exemple qui sera de type int tu le définie avec un AUTO_INCREMENT (donc c'est un champ qui v'as etre incrementé à chaque insertion d'un nouveau membre dans la table membres ) avec ce champ on a assosier a chaque membre un numéro unique non null
. donc idmembre poura bien etre une clé primaire .

CREATE TABLE `membre` (
`idmembre ` INT( 6 ) NOT NULL AUTO_INCREMENT ,
`nom` VARCHAR( 25 ) NOT NULL ,
`prenom` VARCHAR( 25 ) NOT NULL ,
`motpasse` VARCHAR( 30 ) NOT NULL ,
`nomusage` VARCHAR( 30 ) NOT NULL ,
`telephone` INT( 10 ) NOT NULL ,
`email` VARCHAR( 50 ) NOT NULL ,
PRIMARY KEY ( `idmembre ` )
) TYPE=INNODB;

pareil pour la table articles il te faut aussi un idarticles comme clé primaire


CREATE TABLE `articles` (
`idarticle ` INT( 6 ) NOT NULL AUTO_INCREMENT ,
`nombrearticle` VARCHAR( 25 ) NOT NULL ,
`codearticle` INT( 25 ) NOT NULL ,
`titre` VARCHAR( 30 ) NOT NULL ,
`text_article` VARCHAR( 30 ) NOT NULL ,
`auteur ` INT( 10 ) NOT NULL ,

PRIMARY KEY ( `idarticle ` )
) TYPE=INNODB;

maintenant tu dois lier tes tables par des relation
tu commencer par definir la relation entre les tables .

dans notre exemple

1)on commence par definir la relation entre les tables membres et articles ,

un client consulte un article

on voit bien que la relation "consulte " est une relation (n-n) ou (plusieurs-plusieurs) car un client peut consulter 0,1 ou plusieurs articles , et un article peut etre consulter par 0,1,ou plusieurs clients


2) il faut traduire la relation

la traduction d'une relation n-n
donne une table dont la clef primaire et l'union des clefs primaire des class d'entités (membres et articles dans notre exemple )

donc la liaison entre un membre et un article vas etre assurer par une table nommé consulte .

CREATE TABLE `consulte` (
`idmembre ` INT( 6 ) NOT NULL,
`idarticle ` INT( 6 ) NOT NULL ,
PRIMARY KEY ( `idmembre ` ,`idarticle ` )

INDEX (idmembre),
FOREIGN KEY (idmembre)
REFERENCES membres(idmembre)
INDEX (idarticle),
FOREIGN KEY (idarticle)
REFERENCES articles(idarticle)
)


explication :
FOREIGN KEY (idmembre)
REFERENCES membres(idmembre)
INDEX (idarticle),
FOREIGN KEY (idarticle)
REFERENCES articles(idarticle)

idmembre , idarticle sont une clé primaires dans la table consulte mais (on peut les considérer comme clé etrangere ) car il sont des clé dans d'autres table (membres,articles).

c'est pour ça qu' on est obliger de mentioner la reference à ces tables .




j'espaire que j'etais claire a+
bil808@yahoo.fr
7
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 65492 internautes nous ont dit merci ce mois-ci

salut et merci pour votre explication mais il me reste une petite explication c comme exécuté ce script a partir de dream weaver
j fait :
require("connexion.php");
$req="CREATE TABLE `consulte`(
ben vous connaissez la suite..;)type=innodb;
comment faire !!! Merci d'avance
est ce que ce script est logique sa marche mais j doute /
<?php
$db=mysql_connect("localhost", "root", "");
mysql_select_db("projet",$db);

mysql_query("CREATE TABLE `consulter` (
`id_client` INT( 50 ) NOT NULL ,
`code_roule` VARCHAR( 50) NOT NULL ,
INDEX ( `id_client` ) ,
FOREIGN KEY ( `id_client` ) REFERENCES `client` ( `id_client` ) ,
INDEX ( `code_roule` ) ,
FOREIGN KEY ( `code_roule` ) REFERENCES `roule` ( `code_roule` )
) TYPE = InnoDB");
?>
Messages postés
21
Date d'inscription
mardi 20 novembre 2007
Statut
Membre
Dernière intervention
10 février 2008
25
kyky si c'est résolu donc change le staut de sujet (résolut)
Messages postés
2007
Date d'inscription
mercredi 21 novembre 2007
Statut
Membre
Dernière intervention
22 mai 2012
394
Je n'ai pas trop compris le but de tes tables mais mettre un mot de passe comme clé c'est une horreur...deja un mot de passe ca se change alors tu ne va pas te mettre a changer ta clé primaire,ensuite tu as toutes les chances d'avoir des doublons avec les mots de passe. Tu pourrais prendre nom+prénom comme clé ou bien créer une clé aléatoire, pour articles et horaires aussi (ca peut etre un bête numéro d'ordre)
Et bien je dois stockés toutes les informations de mon site en plus des inscriptions dans des tables donc c'est un site sur mon villages ou les personnes inscritents pourront si il sont authentifier consulter les horaires d'ouverture de la mairie par exemple ou meme consulter les articles.
donc c'est surtout pour dire que si les personne est logger et si le mot de passe figure bien dans la base donc afficher par exemple l'article

merci de m'eclairer
je vous remercie mais je suis obliger de refaire une autre table consulte 2 pour faire le lien entre membres et horaires car il s'agit encore d'une relation (n,n)?
donc je peut reprendre encore une fois idmembre et idhoraires comme clé de idconsulte2?
CREATE TABLE `membre` (
`idmembre ` INT( 6 ) NOT NULL AUTO_INCREMENT ,
`nom` VARCHAR( 25 ) NOT NULL ,
`prenom` VARCHAR( 25 ) NOT NULL ,
`motpasse` VARCHAR( 30 ) NOT NULL ,
`nomusage` VARCHAR( 30 ) NOT NULL ,
`telephone` INT( 10 ) NOT NULL ,
`email` VARCHAR( 50 ) NOT NULL ,
PRIMARY KEY ( `idmembre ` )
) TYPE=INNODB;



CREATE TABLE `articles` (
`idarticle ` INT( 6 ) NOT NULL AUTO_INCREMENT ,
`nombrearticle` INT( 6 ) NOT NULL ,
`codearticle` INT( 25 ) NOT NULL ,
`titre` VARCHAR( 30 ) NOT NULL ,
`text_article` VARCHAR( 3000 ) NOT NULL ,
`auteur ` VARCHAR( 25 ) NOT NULL ,

PRIMARY KEY ( `idarticle ` )
) TYPE=INNODB;

CREATE TABLE `horaires` (

`idhoraires` INT( 6 ) NOT NULL AUTO_INCREMENT ,
`nombre_office` INT( 6 ) NOT NULL ,
`code_office` INT( 10 ) NOT NULL ,
`nom_office` VARCHAR( 30 ) NOT NULL ,
`description_office` VARCHAR( 300 ) NOT NULL ,
`gerant_office` VARCHAR( 30 ) NOT NULL ,
`ouverture_office` VARCHAR( 30 ) NOT NULL ,
`fermeture_office` VARCHAR( 30 ) NOT NULL ,
`telephone_office` VARCHAR( 15 ) NOT NULL ,
PRIMARY KEY ( `idhoraires` )
) TYPE=INNODB;


CREATE TABLE `consulte_article` (

`idmembre` INT( 6 ) NOT NULL ,
`idarticle` INT( 6 ) NOT NULL ,
PRIMARY KEY ( `idmembre` , `idarticle` ) ,

INDEX ( `idmembre` ) ,
FOREIGN KEY ( `idmembre` ) REFERENCES `membre` ( `idmembre` ) ,
INDEX ( `idarticle` ) ,
FOREIGN KEY ( `idarticle` ) REFERENCES `articles` ( `idarticle` )
) TYPE = InnoDB



CREATE TABLE `consulte_horaires` (

`idmembre` INT( 6 ) NOT NULL ,
`idhoraires` INT( 6 ) NOT NULL ,
PRIMARY KEY ( `idmembre` , `idhoraires` ) ,

INDEX ( `idmembre` ) ,
FOREIGN KEY ( `idmembre` ) REFERENCES `membre` ( `idmembre` ) ,
INDEX ( `idhoraires` ) ,
FOREIGN KEY ( `idhoraires` ) REFERENCES `horaires` ( `idhoraires` )
) TYPE = InnoDB


voila j'ai donc creer mes tables sous mysql merci ^^
c'est resolu
Messages postés
21
Date d'inscription
mardi 20 novembre 2007
Statut
Membre
Dernière intervention
10 février 2008
25
de rien kyky ;)
Bonjour,

j'aurais aimé savoir à quoi servent les termes "Index" dans la table 'consulte_horaires':

CREATE TABLE 'consulte_horaires' (

'idmembre' INT( 6 ) NOT NULL ,
'idhoraires' INT( 6 ) NOT NULL ,
PRIMARY KEY ( 'idmembre' , 'idhoraires' ) ,

INDEX ( 'idmembre' ) ,
FOREIGN KEY ( 'idmembre' ) REFERENCES 'membre' ( 'idmembre' ) ,
INDEX ( 'idhoraires' ) ,
FOREIGN KEY ( 'idhoraires' ) REFERENCES 'horaires' ( 'idhoraires' )
) TYPE = InnoDB

Peut-on créer la table sans les "Index"? Comme ci-dessous

CREATE TABLE 'consulte_horaires' (

'idmembre' INT( 6 ) NOT NULL ,
'idhoraires' INT( 6 ) NOT NULL ,
PRIMARY KEY ( 'idmembre' , 'idhoraires' ) ,

FOREIGN KEY ( 'idmembre' ) REFERENCES 'membre' ( 'idmembre' ) ,

FOREIGN KEY ( 'idhoraires' ) REFERENCES 'horaires' ( 'idhoraires' )
) TYPE = InnoDB

Merci d'avance.