Aller au menu - Aller au contenu

[Plan du site] Vous êtes ici --- > Le Site du Zér0 > Les tutoriels > Non-Officiels > Site Web > PHP > Base de données > Lecture du tutoriel

Créer des relations dans votre base de données

Avatar
Auteur : Mickael Knight
Créé : le 30/10/2007 17:18:06
Modifié : le 28/04/2008 16:17:00
Noter et commenter ce tutoriel
Imprimer ce tutoriel
Vous vous apprêtez à lire un tutoriel rédigé par un membre de ce site. Malgré tout le soin que ce membre a pu apporter au tutoriel, nous ne pouvons pas garantir que les informations contenues sur cette page sont exactes à 100%. Merci de garder cela en tête lorsque vous lirez cette page ;o)
Bonjour à tous et bienvenue dans mon nouveau cours qui est destiné aux relations dans une base de données.

Lorsque je me promène sur le forum PHP/MySQL de ce site, je suis "choqué" par le fait que beaucoup de membres utilisent une base uniquement pour stocker et lire des données. Si vous êtes ici, c'est sûrement votre cas. ^^

Eh bien moi, je vais vous montrer que votre base de données vous permet d'obtenir davantage de puissance sur la gestion de vos données en créant des relations. Ainsi, vous apprendrez dans ce cours comment on crée une vraie base de données relationnelle, et les avantages dont vous pouvez en profiter dans vos applications.
Sommaire du chapitre :

Tout est une question de clé !

Dans chaque table, vous avez obligatoirement une clé dite primaire. Pour rappel, elle sert à identifier chaque enregistrement (une ligne grosso-modo) par un numéro unique. Par conséquent, elle vous permet d'éviter les doublons (plusieurs fois la même donnée), et c'est grâce à elle que vous pouvez aisément faire vos premières requêtes SQL, comme "Trouve-moi le client ayant pour numéro 654320".

Et voilà, le travail de MySQL (votre serveur de base de données, généralement) s'arrête ici.

QUOI ? Déjà fini ?? o_O

En effet, MySQL utilise par défaut un moteur de stockage qui se nomme MyISAM. Ce dernier est un moteur très performant en terme de réactivité et de performances, mais il y a un hic : il ne permet pas les relations entre 2 tables. Cela nous oblige donc à changer de moteur (c'est assez simple, heureusement) qui lui permet de faire des relations et plein d'autres choses sympathiques :D . Évidemment, ce moteur, qui porte le nom de InnoDB, permet davantage de fonctionnalités sur le traitement de vos données mais décroît légèrement les performances de votre base de données. En revanche, il sera très à l'aise avec de grosses données, car avec des relations, toutes les données sont dépendantes entre elles, donc aucune donnée ne sera orpheline.

Mouais, mais c'est quoi une relation, en gros ?

Prenons l'exemple de votre famille, en faisant une impasse sur votre père pour simplifier. Pour le moment, vous êtes dans une table ENFANT et votre mère dans la table MERE.
ENFANT(matricule_enfant, matricule_mere, nom, prenom ...);
MERE(matricule_mere, nom, prenom);


Vous remarquerez que vous êtes identifiés par un numéro dit matricule, ainsi que votre mère ; ces matricules font office de clé primaire dans les 2 tables. Pourtant, on remarque matricule_mere dans votre table, ce qui fait qu'un enfant a une seule et unique mère (normalement, sinon j'aurais du mal à imaginer le contraire :lol: ).

Cas 1 : sans relation


Maintenant, imaginez que je supprime votre mère (je suis cruel, n'est-ce pas ? :pirate: ). Vous existez toujours dans la base de données, car vous dites "je suis Dupond Jacques, numéro 54, issu de ma mère numéro 50". Pourtant... il n'y a plus aucune mère qui corresponde au numéro 50 dans la table mere. Par conséquent, vous êtes une donnée orpheline, c'est-à-dire une donnée obsolète qui occupe de la place inutilement dans votre base.

Cas 2 : avec relation


On fait de la même manière : on supprime votre mère qui porte le numéro 50. MAIS, MySQL voit qu'il y a une relation avec enfant, donc il va voir dans cette table tous les enfants qui portent le numéro 50 en guise de matricule_mere et les supprime. Eh oui, car pour MySQL, sans mère, vous n'êtes pas censé exister. Donc concrètement, vous vous retrouvez avec une base saine sans données qui soient perdues, ce qui est très utile pour les grosses tables bourrées de millions de lignes :D .

En terme de modèle relationnel, on appelle l'attribut matricule_mere, une clé étrangère et qui est liée à la table MERE avec une intégrité référentielle (en langage humain, ça veut dire que vous êtes obligé d'avoir une mère qui existe dans la table MERE). J'en profite aussi pour dédicacer ce cours à mon prof de comptabilité, il va aimer ça :D .


Évidemment, une vraie, une dure base de données qui alimente les gros sites internet font appel à des centaines, voire des milliers de relations. L'utilisation des relations est importante pour faciliter la mise à jour de vos applications PHP et autres. Pour le moment, vos "relations" sont faites dans l'application, ce qui vous oblige à prendre soin de conserver vos relations lors de vos mises à jour. Si vous tenez un forum par vous-mêmes, je vois que si vous supprimez un sujet de discussion, vous êtes obligés de faire 2 requêtes : l'une qui vire le sujet et l'autre qui vire les messages contenus dans ce sujet (eh oui je suis fort, c'est Knight Voyance :soleil: ). Mais nous allons voir comment on fait pour que l'autre paresseux de MySQL fasse lui-même les relations, ce qui vous facilitera la vie pour votre développement (exemple : on fait une seule suppression avec une seule requête sur le sujet de discussion, et les messages sont supprimés grâce à la relation avec le sujet !).

Une relation sous Access 2007
L'exemple précédent aux yeux de Microsoft Access 2007

La création des relations sur votre serveur MySQL

Dans cette partie, nous allons utiliser le logiciel PHP, nommé PhpMyAdmin. Personnellement, je gère tout en direct avec Access 2007, mais mon choix porte sur PhpMyAdmin car il est gratuit et fourni avec tous les hébergements par défaut ; cette partie sera donc réalisable par la majorité des lecteurs ;) .

Création des tables



Tout d'abord, nous allons créer nos 2 tables MERE et ENFANT. Je vous prie de faire EXACTEMENT ce qu'il y a sur les captures. Les lecteurs avertis verront qu'il y a une erreur, c'est volontaire.

Création de la table ENFANT

Création de la table MERE

Raaah zut, vous venez de créer la table MERE en MyISAM. Pas grave, allez dans Opérations et dans Moteur de stockage, vous pouvez séléctionner InnoBD. Vos données seront donc converties sur vos tables existantes. Facile, non ? ;)
Changer le moteur de stockage


Ajout des données



Maintenant, nous allons insérer nos premières données. Rendez-vous dans SQL, cliquez sur Masquer les numéros de ligne et collez les requêtes ci-dessous :
Code : SQL
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
INSERT INTO `mere` ( `matricule_me` , `nom_me` , `prenom_me` )
VALUES (
NULL , 'Dupond', 'Sandrine'
), (
NULL , 'Muller', 'Delphine'
);
 
 
INSERT INTO `enfant` ( `matricule_enf` , `matricule_me` , `nom_enf` , `prenom_enf` )
VALUES (
NULL , '1', 'Dupond', 'Cédric'
), (
NULL , '1', 'Dupond', 'Pascal'
);
INSERT INTO `enfant` ( `matricule_enf` , `matricule_me` , `nom_enf` , `prenom_enf` )
VALUES (
NULL , '2', 'Muller', 'Jean'
), (
NULL , '2', 'Muller', 'Marc'
);
INSERT INTO `enfant` ( `matricule_enf` , `matricule_me` , `nom_enf` , `prenom_enf` )
VALUES (
NULL , '2', 'Muller', 'Jacques'
), (
NULL , '2', 'Muller', 'Luc'
);


Unir les 2 tables par les liens sacrés du mariage. Qu'elles s'unissent et s'aiment à jamais jusqu'à la fin des temps. :p



Si vous vous baladez dans la structure de votre table, vous devrez apercevoir un Gestion des relations en bas de vos champs. Je vous invite à aller dans la table qui va être soumise à votre relation, j'entends par là, celle qui accueille votre clé étrangère, donc notre table ENFANT, puis Gestion des relations.
Gestion des relations


Maintenant, nous voyons que matricule_me nous permet de créer la relation. Donc sur la seconde ligne, cliquez sur la clé primaire de l'autre table à laquelle vous voulez la lier. Ensuite, vous avez 2 comportements auxquels MySQL doit faire face : respectivement, en cas de suppression et en cas de mise à jour.
Le but de ce cours est de garder une base propre et saine : par conséquent, le comportement voulu doit être en mode "CASCADE" ; autrement dit, si votre maman a été supprimée, vous allez donc également être supprimé (paraît qu'un tueur à gages gagne pas mal :-° ).
Voilà, cliquez sur Sauvegarder et comme par magie, vous avez créé votre première relation. Aaaaah, c'est magnifique, non ? ^^
Créer la relation


Tester la relation



À présent, c'est le moment que vous attendez tous : la mort d'une mère et de ses enfants (yeah, des retraites en moins :-° ).
Je vous invite à aller dans le contenu de votre table MERE et de supprimer l'une des mères en cliquant sur le choix qui l'accompagne. Si tout se passe bien, vous devez voir que les enfants qui s'y rattachent sont également supprimés.

Pour ceux qui veulent absolument réduire leur nombre de requêtes SQL, voici le SQL Show. :p
Sans relation : Code : SQL
1
DELETE FROM mere WHERE matricule_me = 1;

Code : SQL
1
DELETE FROM enfant WHERE matricule_me = 1;


Avec relation : Code : SQL
1
DELETE FROM mere WHERE matricule_me = 1;


Par contre, il faut veiller à ajouter une seule et unique fois cette requête pour créer la relation :
Code : SQL
1
ALTER TABLE `enfant` ADD CONSTRAINT `enfant_ibfk_1` FOREIGN KEY (`matricule_me`) REFERENCES `mere` (`matricule_me`) ON DELETE CASCADE ON UPDATE CASCADE;

Voilà, voili, voilu, ce cours est terminé. ^^ Si vous avez des questions supplémentaires, n'hésitez pas à utiliser le forum ou les commentaires.

J'espère que vous avez compris comment tirer profit de votre base de données en utilisant les relations, ce qui fait de vous un administrateur de base de données RELATIONNELLES : la classe, moi j'dis !! :soleil:

Sur ce, je vous souhaite une très bonne journée, soirée, nuit, un joyeux Noël, une bonne année, un joyeux anniversaire aussi... arg je déconne complètement, je fais une overdose de SQL :lol: .

Bon surf sur le Site Du Zér0. ;)

Un homme seul, un chevalier solitaire, Mickael Knight roule vers de nouvelles aventures :-° .
Auteur : Mickael Knight
Noter et commenter ce tutoriel
Imprimer ce tutoriel

Changer de design | En savoir plus | Plan du site | Politique d'accessibilité | Règles | Fil RSS | XHTML 1.0 | CSS 2.0
Édité par Simple IT SARL : Nous contacter | Revue de presse | Publicité

Y'a plus rien à lire, faut remonter maintenant !

Hébergement web - Correction de tutoriels - Créer un site
Vous souhaitez apparaître ici ? Contactez-nous.

Nombre de connectés 482 Zéros connectés | Requêtes SQL 7 requêtes | Temps de génération de la page : Total (SQL) 0.1715s (0.1588s)