Jump to content

Comment lier des tables correctement ?


Recommended Posts

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

Link to post
Share on other sites

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

Edited by NwK
Link to post
Share on other sites

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

Bon, ben je reprends, je vais essayer d'être aussi clair :)

_AT_lors tout d'abord, merci pour ta réponse Anthony, en fait mes tables sont bien en innoDB, mais je les ai finalement recrées car elles ne me semblait pas judicieusement organisées.

J'en suis donc à présent à une architecture qui ressemble à ça:

-- phpMyAdmin SQL Dump

-- version 3.3.9

-- http://www.phpmyadmin.net

--

-- Serveur: localhost

-- Généré le : Mer 06 Avril 2011 à 08:05

-- Version du serveur: 5.1.36

-- Version de PHP: 5.3.5

SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";

--

-- Structure de la table `annonceurs`

--

TABLE `annonceurs`

`id_annonceur` int(11) NOT NULL AUTO_INCREMENT,

`nom` varchar(50) NOT NULL,

`adresse` varchar(50) NOT NULL,

`cp` varchar(5) NOT NULL,

`ville` varchar(50) NOT NULL,

`tel` varchar(10) NOT NULL,

`mail` varchar(50) NOT NULL,

`url` varchar(30) NOT NULL,

`rubrique` varchar(30) NOT NULL,

`image` varchar(50) NOT NULL,

`type` char(1) NOT NULL,

PRIMARY KEY (`id_annonceur`)

ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

--

-- Structure de la table `rubriques`

--

TABLE `rubriques`

`id_rubrique` varchar(30) NOT NULL,

`libelle_fr` varchar(30) NOT NULL,

`libelle_al` varchar(30) NOT NULL,

`libelle_en` varchar(30) NOT NULL,

`desc_fr` varchar(5000) NOT NULL,

`desc_al` varchar(5000) NOT NULL,

`desc_en` varchar(5000) NOT NULL,

PRIMARY KEY (`id_rubrique`)

ENGINE=InnoDB DEFAULT CHARSET=utf8;

j'ai donc tenter une liaison entre les tables "annonceurs(id_annonceurs)" et "rubriques(id_rubrique)"

je n'ai rien spécifié au niveau des listes déroulantes.

J'ai alors le message d'erreur suivant:

Erreur lors de la création de la clé étrangère sur id_annonceur (vérifiez le type des colonnes)

Documentation

Erreur

ALTER TABLE `annonceurs` DROP FOREIGN KEY `annonceurs_ibfk_1` ;

ALTER TABLE `annonceurs` ADD FOREIGN KEY ( `id_annonceur` ) REFERENCES `alsaceinfo`.`rubriques` (

`id_rubrique`

);

Je ne comprends pas bien ou se situe le souci, y a certainement une étape que j'ai raté mais je ne vois pas laquelle. J'ai une clef primaire sur chacune de mes tables donc ça devrait être bon non ?

D'avance merci pour votre aide

Bruno

Edited by aiglobulles
  • Upvote 1
Link to post
Share on other sites

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".

Link to post
Share on other sites

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

Link to post
Share on other sites

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 ;)

Link to post
Share on other sites

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

Link to post
Share on other sites

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

Link to post
Share on other sites
  • 6 months later...

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..

Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...