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

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

).
Cas 1 : sans relation
Maintenant, imaginez que je supprime votre mère (je suis cruel, n'est-ce pas ?

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

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

). 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 !).
L'exemple précédent aux yeux de Microsoft Access 2007
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.
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 ?
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.
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.
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 ?
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.
Sans relation : Code : SQL1 | DELETE FROM mere WHERE matricule_me = 1;
|
Code : SQL1 | DELETE FROM enfant WHERE matricule_me = 1;
|
Avec relation : Code : SQL1 | 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 : SQL1 | 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 !!
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

.
Bon surf sur le Site Du Zér0.
Un homme seul, un chevalier solitaire, Mickael Knight roule vers de nouvelles aventures
.