Aller au contenu

Comment lier des tables correctement ?


Sujets conseillés

Posté

Bonjour,

je rencontre un soucis concernant la liaison de deux tables au sein d'une même base de données. A vrai dire, je n'y comprends pas grand chose dans ces liaisons et du coup, je viens vers vous en espérant avoir quelques petits tuyaux ;)

Tout d'abord, ma configuration sous WAMP SERVEUR:

- apache 2.2.17

- mysql 5.1.36

- php 5.3.5

- PMA 3.3.9

Le sucis:

je dois créer une base de données qui est destinée à recueillir et permettra l'affichage de commerçants de secteurs divers et variés. Il me faut pouvoir afficher leurs coordonnées et éventuellement un screenshot de leur site respectif.

Du coup, j'ai crée 2 tables. L'une pour le détail des clients, l'autre pour le détail et le descriptif des différentes rubriques (sachant que le descriptif des différentes rubriques sera disponible en trois langues.

Ce que j'ai crée:

TABLE CLIENTS:

- id_client (PRIMAIRE AI)

- nom_client

- adresse_client

- cp_client

- ville_client

- tel_client

- mail_client

- site_client

- cat_client

- img_client

- type_client (pour différencier ceux qui payent pour être affichés dans l'annuaire et ceux que l'on ajoute pour tenter d'être exhaustif)

TABLE CATEGORIES:

- id_cat (PRIMAIRE AI)

- nom_cat

- desc_fr_cat

- desc_al_cat

- desc_en_cat

Les tables sont en innoDB.

Je dois encore créer une table "ville" car les recherches sur le site doivent pouvoir s'effectuer par catégorie ou par ville:

ce serait une table du genre:

TABLE VILLE

- id_ville

- nom_ville

- cp_ville

Je suis complètement paumé concernant la création d'une liaison entre ces différentes tables. Pourriez vous m'indiquer une piste, un cheminement ?

D'avance merci pour votre aide et vos conseils

Bruno

Posté (modifié)

Bonjour bruno,

est-ce que le terme de clef étrangère te parle ?

Dans un premier temps sous phpmyadmin pour pouvoir lier tes tables tu dois utiliser le Moteur de stockage InnoDB.

Ensuite il faut que tu prévois un champ dans tes table pour stocker ces clefs étrangère

Exemple :

table clients tu as un champs ville client c'est dedans que tu vindra mettre l'id de la ville issue de la table ville.

Pour ce faire graphiquement rien de plus simple

sous pma tu clique sur structure pour voir la structure de ta table clien

ensuite tu devrai voir Gestion des relations

ensuite tu rempli les cases avec les listes déroulantes :) A noté que seul les clèf primaires et les index peuvent être des clef étrangères.

Est-ce clair comme explication ?

Anthony

Modifié par NwK
Posté

Bonjour,

rhaaa la haine, j'ai passé une demi heure à écrire ma réponse, j'ai cliqué sur "envoyer" et tout s'est effacé...

C'était pas effacé, c'était en modération :P ... Quand on a très peu de message et que l'on met des code ou des urls dans les posts, ils passent en modération et il faut attendre qu'un modo le valide ;) ... C'est une mesure : "anti spam".

Posté

ahhh ok, merci pour la précision Arlette. J'avais justement fait un testen renvoyant un court message juste avant le premier, et voyant qu'il s'éffichait, j'ai cru avoir perdu mon message initialement posté.

_AT_bientôt

Posté

Depuis mon dernier enfin avant dernier message, j'ai compris l'origine de mon soucis (les clefs étrangères), j'ai donc une fois encore revu mes tables et j'ai donc au final (et j'espère que ce sera la dernière mouture ;) )

TABLE `annonceurs`

`id_annonceur` int(3) NOT NULL AUTO_INCREMENT,

`nom_annonceur` varchar(50) CHARACTER SET utf8 NOT NULL,

`adresse` varchar(50) CHARACTER SET utf8 NOT NULL,

`cp_annonceur` int(5) NOT NULL,

`ville_annonceur` varchar(50) CHARACTER SET utf8 NOT NULL,

`tel` int(10) NOT NULL,

`mail` varchar(50) CHARACTER SET utf8 NOT NULL,

`url` varchar(50) CHARACTER SET utf8 NOT NULL,

`type` char(1) CHARACTER SET utf8 NOT NULL,

`rubrique_annonceur` int(3) NOT NULL,

PRIMARY KEY (`id_annonceur`),

KEY `ville_annonceur` (`ville_annonceur`,`rubrique_annonceur`)

ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

TABLE `rubriques`

`id_rubrique` int(3) NOT NULL AUTO_INCREMENT,

`libelle_fr` varchar(50) CHARACTER SET utf8 NOT NULL,

`libelle_al` varchar(50) CHARACTER SET utf8 NOT NULL,

`libelle_en` varchar(50) CHARACTER SET utf8 NOT NULL,

`desc_fr` varchar(2500) CHARACTER SET utf8 NOT NULL,

`desc_al` varchar(2500) CHARACTER SET utf8 NOT NULL,

`desc_en` varchar(2500) CHARACTER SET utf8 NOT NULL,

PRIMARY KEY (`id_rubrique`),

KEY `libelle_fr` (`libelle_fr`)

ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

TABLE `villes`

`id_ville` int(3) NOT NULL AUTO_INCREMENT,

`nom_ville` varchar(50) NOT NULL,

`cp_ville` int(5) NOT NULL,

PRIMARY KEY (`id_ville`),

KEY `nom_ville` (`nom_ville`)

ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

si je lie "annonceurs(ville_annonceur)" à "villes(nom_ville)" et "annonceurs(rubrique_annonceur)" à "rubriques(libelle_fr)"

je devrais bien avoir une liaison entre les trois tables et pouvoir faire des selects sur n'importe quel champ non ?

les libellé et desc seront les éléments traduits (libelle pour le nom des rubriques et desc pour permettre l'affichage d'un court texte pour chacune d'elle)

Merci pour vos explications... en attendant j'ai faim ;)

Posté

Bonjour,

i je lie "annonceurs(ville_annonceur)" à "villes(nom_ville)" et "annonceurs(rubrique_annonceur)" à "rubriques(libelle_fr)"

je devrais bien avoir une liaison entre les trois tables et pouvoir faire des selects sur n'importe quel champ non ?

Les cléfs étrangères ne sont pas la pour te permettre de faire des sélect sur n'importe quel champ mais plutôt pour t'aider à mieux gérer les liens entre tes tables dans le cas de mise à jour d'un id ou suppression d'un élement. tu as 3 possibilité en cas d'update et de delete

CASCADE

SET NULL

NO ACTION / RESTRICT (action identique sous mysql)

Tu peux effectivement faire des select sur les éléments que tu veux. Clé étrangère ou non. Mais grace aux clèf étrangère tu ne pourra pas saisir l'id d'une ville inexistante ni supprimer une ville habité par certain de tes clients sauf si tu l'a autorisé et dans ce cas ça fera l'action que tu as choisi.

c'est clair ? =)

Anthony

Posté

Encore merci pour tes conseils Anthony,

j'ai finalement réussi à mettre en place les liaisons que je souhaitais. A présent, si j'entre par exemple un nouvel annonceur, le champs ville présente une liste déroulante me proposant de choisir l'id d'une ville... bon, ce serait sans doute plus parlant si le nom de la ville s'affichait mais je le coderait pour le backoffice.

_AT_présent, j'essaye de gérer l'affichage de requêtes dans mes pages, j'utilise le moteur de template TBS que nous avons abordé en cours.

Plus d'infos sous quelques jours en fonction de mon avancement... je réinvente la roue histoire de m'habituer à manipuler les requêtes et les fonctions php... mais si vraiment je bloque, j'ai mis en place en parallèle un site joomla/joomfish ;)

Bonne journée à toi et encore merci

  • 6 months later...
Posté

bonsoir

pour lier les tables il faut utiliser les jointures entre ces tables,ce que je pense qu'il yen besoin des clées primaires et autres etrangéres pour faire la liaison, par exemple pour 3 table il nous faut 2 jointure et comme ca..

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...