<?xml version="1.0"?>
<rss xmlns:php="http://php.net/xsl" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title>Relation 1-à-1 sans clé - Chicoree</title><link>http://www.chicoree.fr/w/Relation_1-%C3%A0-1_sans_cl%C3%A9</link><atom:link href="http://www.chicoree.fr/w/Relation_1-%C3%A0-1_sans_cl%C3%A9?action=toFeed" rel="self" type="application/rss+xml"/><description><![CDATA[Il y a quelques temps, j'ai dû évaluer le travail d'un étudiant. Et en observant son code de plus près, j'ai découvert une horreur absolue du point de vue des bases de données.
Avant d'en dire plus, voyons si vous arrivez à distinguer ce qui est choquant.
]]></description><item><title>1 Le programme incriminé</title><link>http://www.chicoree.fr/w/Relation_1-%C3%A0-1_sans_cl%C3%A9#Le_programme_incrimin.C3.A9</link><description><![CDATA[<p>Bien sûr, je ne vais pas reproduire ici l'intégralité du programme en cause. J'en ai extrait la partie sur laquelle je souhaite insister. Ce programme était une sorte d'application web <i>sociale</i> dans laquel un <b>utilisateur</b> s'inscrivait – et par la suite était connu des autres utilisateurs du système via son <b>avatar</b>. Dans la base de données, deux tables avaient été crées: une contenant les informations de l'utilisateur telles que son nom réel et la validité de son abonnement au site. L'autre contenait les données de l'avatar: pseudonyme, icône, etc. Un utilisateur ne peut avoir qu'un seul avatar. Il existe donc une relation un-à-un entre ces deux tables.
</p>]]></description></item><item><title>1.1 Jour 1: tout va bien</title><link>http://www.chicoree.fr/w/Relation_1-%C3%A0-1_sans_cl%C3%A9#Jour_1:_tout_va_bien</link><description><![CDATA[<p>Dans cette version, l'étudiant a créé la base de données et la table <tt>Utilisateur</tt>. Ce qui ressemble à ceci en utilisant Derby:
</p>]]></description></item><item><title>1.2 Jour 2: rien ne va plus</title><link>http://www.chicoree.fr/w/Relation_1-%C3%A0-1_sans_cl%C3%A9#Jour_2:_rien_ne_va_plus</link><description><![CDATA[<p>Ici, les choses vont se corser. L'étudiant a tout d'abord ajouté la table des avatars:
</p>]]></description></item><item><title>2 Ce qui ne va pas</title><link>http://www.chicoree.fr/w/Relation_1-%C3%A0-1_sans_cl%C3%A9#Ce_qui_ne_va_pas</link><description><![CDATA[<p>Le problème ici est une méconnaissance des principes fondamentaux d'une base de données <b>relationnelle</b>. Ici, l'étudiant s'est dit que le SELECT allait renvoyer les utilisateurs dans l'ordre dans lequel ils ont été rentrés, et les avatars dans l'ordre de leur création. En outre, puisque les utilisateurs et les avatars sont créés dans le même ordre, il lui a semblé logique que la première ligne récupérée dans <tt>rsa</tt> corresponde à la première ligne de <tt>rsu</tt>. Et ainsi de suite. En plus, le test du programme <i>semble</i> prouver que ce raisonnement est exact. <b>Mais il ne l'est pas!</b>
</p>]]></description></item><item><title>2.1 Preuve par l'exemple</title><link>http://www.chicoree.fr/w/Relation_1-%C3%A0-1_sans_cl%C3%A9#Preuve_par_l.27exemple</link><description><![CDATA[<p>Vous voulez donc une preuve qu'un SELECT ne renvoie pas les données dans l'ordre de leur saisie? Et bien voici deux requêtes SELECT dénuées de clause ORDER BY. Et comme vous le verrez, l'ordre du résultat est clairement diffèrent!
</p>]]></description></item><item><title>3 Qu'est ce qu'il faut faire</title><link>http://www.chicoree.fr/w/Relation_1-%C3%A0-1_sans_cl%C3%A9#Qu.27est_ce_qu.27il_faut_faire</link><description><![CDATA[<p>La bonne solution ici est de rajouter dans une des tables un champ qui fait référence à la ligne correspondante dans l'autre table. C'est ce que l'on appelle une <b>clé étrangère</b>. C'est par l'intermédiaire de cette clé que les deux tables vont être <b>associées</b>. Nous avons deux options possibles:
</p>]]></description></item><item><title>4 Conclusion</title><link>http://www.chicoree.fr/w/Relation_1-%C3%A0-1_sans_cl%C3%A9#Conclusion</link><description><![CDATA[<p>Je pense que maintenant le message est clairement passé: <b>La seule manière valide d'associer des données provenant de tables différentes dans le modèle relationnel est en utilisant une jointure</b>. Et surtout pas en faisant des suppositions hasardeuses sur l'ordre des données renvoyées par la requête SELECT.
</p>]]></description></item></channel></rss>
