<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet title="XSL formatting" type="text/xsl" href="http://methylbro.titaxium.org/feed/rss2/xslt" ?><rss version="2.0"
  xmlns:dc="http://purl.org/dc/elements/1.1/"
  xmlns:wfw="http://wellformedweb.org/CommentAPI/"
  xmlns:content="http://purl.org/rss/1.0/modules/content/"
  xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
  <title>Méthylbro Développeur Web PHP - Tag - Base de Données</title>
  <link>http://methylbro.titaxium.org/</link>
  <atom:link href="http://methylbro.titaxium.org/feed/tag/Base%20de%20Donn%C3%A9es/rss2" rel="self" type="application/rss+xml"/>
  <description>Développeur Web PHP</description>
  <language>fr</language>
  <pubDate>Wed, 08 Sep 2010 20:21:12 +0200</pubDate>
  <copyright></copyright>
  <docs>http://blogs.law.harvard.edu/tech/rss</docs>
  <generator>Dotclear</generator>
  
    
  <item>
    <title>Adminer : Une alternative à PHPMyAdmin qui tient dans un seul fichier</title>
    <link>http://methylbro.titaxium.org/post/2009/09/23/adminer-une-alternative-a-phpmyadmin-qui-tient-dans-un-seul-fichier</link>
    <guid isPermaLink="false">urn:md5:03f7df98f5617b5b2706ab3844f406e3</guid>
    <pubDate>Wed, 23 Sep 2009 08:00:00 +0200</pubDate>
    <dc:creator>Méthylbro</dc:creator>
        <category>Liens</category>
        <category>administration</category><category>Base de Données</category><category>base de données</category><category>bdd</category>    
    <description>&lt;p style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;http://www.adminer.org/en/&quot;&gt;&lt;img src=&quot;http://methylbro.titaxium.org/portfolio/methylbro/public/images/encarts/adminer.jpg&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Voilà une alternative intéressante au monstrueux PHPMyAdmin ; Adminer. Ce programme écrit en PHP permet des fonctionnalités d'administration graphique d'un ensemble de base de données MySQL. &lt;/p&gt;
&lt;p&gt;Comme vous l'aurez deviné dans le titre, le principal atout d'Adminer c'est qu'il tient dans un simple fichier. Facile et rapide a installer donc. &lt;/p&gt;
&lt;p&gt;Niveau fonctionnalités, Adminer est un concurrent sérieux de PHPMyAdmin. En effet, Adminer embarque toute une pléiade de choses intéressante, en plus des options minimum que l'on peu attendre d'un tel script : &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Sélection, édition et création d'occurrences de table en mode graphique&lt;/li&gt;
&lt;li&gt;Assistant graphique pour la création de tables et de vues&lt;/li&gt;
&lt;li&gt;Assistant graphique pour la création de procédures, de fonctions et de triggers&lt;/li&gt;
&lt;li&gt;Import et export de données aux formats SQL et CVS&lt;/li&gt;
&lt;li&gt;Gestion des privilèges pour les utilisateurs&lt;/li&gt;
&lt;li&gt;...&lt;/li&gt;
&lt;/ul&gt;    &lt;p&gt;Dans ma rapide découverte de ce script, deux fonctionnalités que je trouve très intéressantes m'ont attiré l'attention :&lt;/p&gt;
&lt;h3&gt;Des liens sur les clés étrangères&lt;/h3&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img src=&quot;http://methylbro.titaxium.org/portfolio/methylbro/public/images/adminer/adminer-links-on-foreign-keys.jpg&quot; alt=&quot;Des liens sur les clés étrangères&quot; /&gt;&lt;/p&gt;
&lt;p&gt;La première est quelque chose que je n'ai encore jamais vu sur les versions de PHPMyAdmin que j'utilise (je ne sait pas si dans les toutes dernières versions c'est proposé). Il s'agit d'un simple lien placé sur les clés étrangères lorsque l'on navigue parmi des occurrences. &lt;/p&gt;
&lt;p&gt;Cela n'a l'air de rien comme ça, mais c'est tout bonnement génial d'avoir enfin pensé à le faire. &lt;/p&gt;
&lt;h3&gt;Un éditeur de MPD&lt;/h3&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img src=&quot;http://methylbro.titaxium.org/portfolio/methylbro/public/images/adminer/adminer-schema-db.jpg&quot; alt=&quot;Un éditeur de MPD&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Le petit générateur de Modèle Physique des Données (les habitués de MERISE comprendrons) est aussi agréable. Il est plus sympathique de se représenter graphiquement certaines bases de données. &lt;/p&gt;
&lt;p&gt;Cependant parfois, si aucun MCD n'a été réalisé à la conception c'est un cauchemar. Ce petit éditeur me sera également utile pour un projet actuel sur lequel je travaille ou la base de donnée actuelle ne ressemble plus du tout au modèle que j'ai sur papier. &lt;/p&gt;
&lt;h3&gt;Conclusion&lt;/h3&gt;
&lt;p&gt;Voici donc un projet qui a un fort potentiel. A tester et a garder sous la main. Ce script peut s'avérer utile.&lt;/p&gt;
&lt;p style=&quot;text-align:center;&quot;&gt;&lt;a href=&quot;http://methylbro.titaxium.org/post/2009/09/23/&lt;a href=&quot;http://www.adminer.org/en/&quot; target=&quot;_blank&quot;&gt;Adminer&lt;/a&gt;&lt;/p&gt;</description>
    
    
    
          <comments>http://methylbro.titaxium.org/post/2009/09/23/adminer-une-alternative-a-phpmyadmin-qui-tient-dans-un-seul-fichier#comment-form</comments>
      <wfw:comment>http://methylbro.titaxium.org/post/2009/09/23/adminer-une-alternative-a-phpmyadmin-qui-tient-dans-un-seul-fichier#comment-form</wfw:comment>
      <wfw:commentRss>http://methylbro.titaxium.org/feed/atom/comments/387</wfw:commentRss>
      </item>
    
  <item>
    <title>Bases de Données Relationnelles - Partie 4</title>
    <link>http://methylbro.titaxium.org/post/2008/11/09/Bases-de-Donnees-Relationnelles-sql-create-table-constraint</link>
    <guid isPermaLink="false">urn:md5:7bc4c5487b931728b3e9a1bdb2dee243</guid>
    <pubDate>Tue, 11 Nov 2008 10:10:00 +0100</pubDate>
    <dc:creator>Méthylbro</dc:creator>
        <category>Tutoriels</category>
        <category>Base de Données</category><category>BDD</category><category>MySQL</category><category>Relation</category><category>SQL</category>    
    <description>&lt;p&gt;Après avoir dans un premier temps défini un &lt;a href=&quot;http://methylbro.titaxium.org/post/2008/10/12/Bases-de-Donnees-Relationnelles&quot;&gt;exemple&lt;/a&gt;, puis expliqué les concepts d'&lt;a href=&quot;http://methylbro.titaxium.org/post/2008/10/13/Bases-de-Donnees-Relationnelles/Relations-Agregation&quot;&gt;agrégation&lt;/a&gt; et de &lt;a href=&quot;http://methylbro.titaxium.org/post/2008/11/09/Bases-de-Donnees-Relationnelles/Relations-Composition&quot;&gt;composition&lt;/a&gt;, je vous propose d'entrer enfin dans le vif du sujet : la création de votre &lt;strong&gt;base de données&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Aujourd'hui nous allons voir comment traduire concrètement les liens de relations entre vos tables lors de la création de vos base de données. Tout cela illustré avec des exemples de script de création de table en SQL.&lt;/p&gt;
&lt;p&gt;Avant de commencer, je tient à signaler que l'ensemble des scripts suivant ont été testés sur le &lt;acronym title=&quot;Systéme de Gestion de Base de Données Relationnelle&quot;&gt;SGBDR&lt;/acronym&gt; MySQL 5.0.&lt;/p&gt;    &lt;h2&gt;Création de notre base de données&lt;/h2&gt;
&lt;p&gt;Maintenant que nous avons conçue notre &lt;strong&gt;base de données&lt;/strong&gt;, que nous savons quelles sont les données que nous allons devoir stocker et comment ces dernières s’articulent entre elles, nous allons pouvoir créer notre &lt;strong&gt;base de données&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Pour rappel, voici notre &lt;acronym title=&quot;Modèle Conceptuel des Données&quot;&gt;MCD&lt;/acronym&gt; final :&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;http://methylbro.titaxium.org/portfolio/methylbro/public/images/mcd_exemple_lego.gif&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://methylbro.titaxium.org/portfolio/methylbro/public/images/.mcd_exemple_lego_s.jpg&quot; alt=&quot;&quot; style=&quot;border: medium none ;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Avant de commencer à créer nos tables, créons une &lt;strong&gt;base de données&lt;/strong&gt; de tests :&lt;/p&gt;
&lt;code&gt;CREATE DATABASE `TEST_LEGO`;&lt;/code&gt;
&lt;p&gt;Les exemples suivants utiliseront cette même &lt;strong&gt;base de données&lt;/strong&gt; :&lt;/p&gt;
&lt;code&gt;USE `TEST_LEGO`;&lt;/code&gt;
&lt;h3&gt;La table Thème&lt;/h3&gt;
&lt;p&gt;Nous allons commencer par définir une première entité simple, les thèmes de construction. D'ailleurs, a partir de maintenant, je ne vais plus parler d'entité, mais de &lt;strong&gt;table&lt;/strong&gt;. &lt;/p&gt;
&lt;p&gt;En effet, nous ne sommes plus au niveau &lt;strong&gt;logique &lt;/strong&gt;de notre conception mais désormais au niveau &lt;strong&gt;physique&lt;/strong&gt;. Ne vous inquiétez pas, le nom change mais le concept reste sensiblement le même.&lt;/p&gt;
&lt;code&gt;CREATE TABLE `LEGO__THEME` (&lt;br /&gt;
`id` int(11) NOT NULL auto_increment,&lt;br /&gt;
`nom` varchar(255) NOT NULL,&lt;br /&gt;
`description` text NULL,&lt;br /&gt;
PRIMARY KEY (`id`)&lt;br /&gt;
)TYPE=InnoDB;&lt;/code&gt;
&lt;p&gt;Comme vous pouvez le voir dans ce premier script &lt;acronym title=&quot;Structured Query Language&quot;&gt;SQL&lt;/acronym&gt; il n'y a pour le moment aucun grand changement comparativement aux &lt;strong&gt;tables &lt;/strong&gt;que vous avez déjà pu créer jusqu'à aujourd'hui.&lt;/p&gt;
&lt;p&gt;Pourtant, cet exemple utilise le moteur de table &lt;a href=&quot;http://dev.mysql.com/doc/refman/5.0/fr/innodb.html&quot;&gt;InnoDB&lt;/a&gt;. Nous allons utiliser ce moteur de table afin que MySQL prenne bien en compte plus loin les&lt;strong&gt; clés étrangères&lt;/strong&gt; et autres &lt;strong&gt;contraintes &lt;/strong&gt;que nous allons définir. Je m'attarderais dans un autre tutoriel sur les différents moteurs de tables de MySQL.&lt;/p&gt;
&lt;h3&gt;La table Construction&lt;/h3&gt;
&lt;p&gt;Maintenant nous allons pouvoir entrer dans le vif du sujet. Voici notre première table incluant une &lt;strong&gt;clé étrangère&lt;/strong&gt;. Nous allons donner vie dans cet exemple à notre premier type de relation dont je parlais dans un billet précédant : l'&lt;a href=&quot;http://methylbro.titaxium.org/post/2008/10/13/Bases-de-Donnees-Relationnelles/Relations-Agregation&quot;&gt;agrégation&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Comment ce traduit l'&lt;a href=&quot;http://methylbro.titaxium.org/post/2008/10/13/Bases-de-Donnees-Relationnelles/Relations-Agregation&quot;&gt;agrégation&lt;/a&gt; entre deux entités au sein d'une &lt;strong&gt;base de données&lt;/strong&gt; ? Et bien c'est très simple, il faudra mettre en place une &lt;strong&gt;clé étrangère&lt;/strong&gt; (&lt;strong&gt;Foreign Key&lt;/strong&gt; en anglais). Cette &lt;strong&gt;clé étrangère&lt;/strong&gt; correspondra en fait à un champ contenant la valeur de la clés primaire de l'entité agrée. &lt;/p&gt;
&lt;p&gt;Reprenons notre exemple ; comment décrire au sein de notre &lt;strong&gt;base de données&lt;/strong&gt; qu'une Construction en Lego doit appartenir à un thème ? C'est très simple, il suffit d'enregistrer ceci au sein de notre &lt;strong&gt;table&lt;/strong&gt; Construction. &lt;/p&gt;
&lt;p&gt;Pour ce faire, nous allons en plus de nos champs classiques ajouter une colonne qui contiendra pour chaque construction l'identifiant du thème auquel elle appartient. Puis nous signalerons à MySQL que ce champ correspond a un identifiant provenant de la table THEME.&lt;/p&gt;
&lt;code&gt;CREATE TABLE `LEGO__CONSTRUCTION` (&lt;br /&gt;
`id` int(11) NOT NULL auto_increment,&lt;br /&gt;
`reference` varchar(15) NOT NULL UNIQUE,&lt;br /&gt;
`nom` varchar(255) NOT NULL,&lt;br /&gt;
`description` text NULL,&lt;br /&gt;
`date_creation` timestamp(10) NOT NULL,&lt;br /&gt;
`theme` int(11) NOT NULL,&lt;br /&gt;&lt;br /&gt;
CONSTRAINT `affilier` FOREIGN KEY (`theme`)&lt;br /&gt;
REFERENCES `LEGO__THEME` (`id`)&lt;br /&gt;
ON DELETE CASCADE ON UPDATE CASCADE,&lt;br /&gt;&lt;br /&gt;
PRIMARY KEY (`id`)&lt;br /&gt;
)TYPE=InnoDB;&lt;/code&gt;
&lt;p&gt;Voilà, nous venons d'introduire un concept primordial dans la création de &lt;strong&gt;base de données relationnelle&lt;/strong&gt; : les &lt;strong&gt;contraintes&lt;/strong&gt;. Ici par exemple, en créant une telle &lt;strong&gt;base de données&lt;/strong&gt;, nous venons de contraindre les champ Theme de la table CONSTRUCTION à toujours avoir une valeur égale à une &lt;strong&gt;clé primaire&lt;/strong&gt; de la table THEME.&lt;/p&gt;
&lt;p&gt;En gros, il sera impossible d'enregistrer une construction dont le thème n'existe pas. Dans le cas contraire, MySQL vous en refusera l'insertion. &lt;/p&gt;
&lt;p&gt;Autre point important, nous venons en moins d'une ligne d'affecter un comportement qui peut s'avérer extrêmement utile. La suppression et la modification en cascade (&lt;em&gt;ON DELETE CASCADE, ON UPDATE CASCADE&lt;/em&gt;). Cette instruction permet par exemple d'enchainer une série de suppression et de modification en cascade.&lt;/p&gt;
&lt;p&gt;Par exemple, si nous souhaitons supprimer le thème &quot;Voitures&quot;, la &lt;strong&gt;base de données&lt;/strong&gt; supprimera automatiquement toutes les constructions qui ont se thème pour attribut. De même, l'instruction &quot;&lt;em&gt;ON UPADTE CASCADE&lt;/em&gt;&quot; modifieras toutes les entrées de votre thème dans la table CONSTRUCTION si vous en modifié la valeur dans THEME.&lt;/p&gt;
&lt;p&gt;Sachez que d'autres instructions du même genre sont possibles, par exemple : &lt;/p&gt;
&lt;p&gt;&lt;code&gt;ON DELETE RESTRICT, &lt;br /&gt;ON UPDATE CASCADE&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;ON DELETE NO ACTION, &lt;br /&gt;ON UPDATE RESTRICT&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;La table Brique&lt;/h3&gt;
&lt;p&gt;Avant de nous préoccuper de notre lien de composition, je voudrais vous donner un autre exemple de &lt;strong&gt;contrainte&lt;/strong&gt; réalisable. Il s'agit de la &lt;strong&gt;contrainte d'unicité&lt;/strong&gt; qui permet sur une &lt;strong&gt;table&lt;/strong&gt; de rendre unique une valeur, ou un ensemble de valeurs sur toutes les occurrences. &lt;/p&gt;
&lt;p&gt;Par exemple, on sait qu'une &lt;strong&gt;clé primaire&lt;/strong&gt; sous entend une &lt;strong&gt;contrainte d'unicité&lt;/strong&gt;. En effet, sur une même table vous ne pourrais jamais avoir deux valeurs identiques pour une clé primaire.&lt;/p&gt;
&lt;p&gt;Il s'agit un peut du même principe ici. Prenons par exemple une brique. Dans notre &lt;strong&gt;base de données&lt;/strong&gt; nous souhaitons éviter d'avoir plusieurs fois enregistré des briques avec des caractéristiques identiques. &lt;/p&gt;
&lt;p&gt;En fait il serait incohérent d'enregistrer plusieurs fois une brique de même hauteur/largeur/profondeur avec un numéro d'identifiant différent. Nous allons donc lors de la création de notre &lt;strong&gt;table&lt;/strong&gt; BRIQUE déclarer la &lt;strong&gt;contrainte&lt;/strong&gt; &lt;em&gt;Caractéristiques &lt;/em&gt;qui aura pour rôle d'interdire ce genre de doublons.&lt;/p&gt;
&lt;code&gt;CREATE TABLE `LEGO__BRIQUE` (&lt;br /&gt;
`id` int(11) NOT NULL auto_increment,&lt;br /&gt;
`hauteur` integer NOT NULL,&lt;br /&gt;
`largeur` integer NOT NULL,&lt;br /&gt;
`profondeur` integer NOT NULL,&lt;br /&gt;&lt;br /&gt;
UNIQUE `caracteristiques` (`hauteur`, `largeur`, `profondeur`),&lt;br /&gt;&lt;br /&gt;
PRIMARY KEY (`id`)&lt;br /&gt;
)TYPE=InnoDB;&lt;/code&gt;
&lt;h3&gt;La table Composer&lt;/h3&gt;
&lt;p&gt;Désormais il ne nous reste plus qu'a créer notre lien de &lt;a href=&quot;http://methylbro.titaxium.org/post/2008/11/09/Bases-de-Donnees-Relationnelles/Relations-Composition&quot;&gt;composition&lt;/a&gt; entre les tables CONSTRUCTION et BRIQUE. Comme nous l'avons vu juste au dessus, un lien d'&lt;a href=&quot;http://methylbro.titaxium.org/post/2008/10/13/Bases-de-Donnees-Relationnelles/Relations-Agregation&quot;&gt;agrégation&lt;/a&gt; se traduit par une &lt;strong&gt;clé étrangère&lt;/strong&gt;. Pour la &lt;a href=&quot;http://methylbro.titaxium.org/post/2008/11/09/Bases-de-Donnees-Relationnelles/Relations-Composition&quot;&gt;composition&lt;/a&gt;, ce sera le même principe, en un peut plus complexe. Car au lieu de n'avoir qu'une &lt;strong&gt;clé étrangère&lt;/strong&gt;, nous en auront deux. Et cet ensemble de &lt;strong&gt;clés étrangères&lt;/strong&gt; formera la &lt;strong&gt;clé primaire&lt;/strong&gt; d'une nouvelle table. &lt;/p&gt;
&lt;p&gt;Attention, il est primordial que la &lt;strong&gt;clé primaire&lt;/strong&gt; de cette nouvelle table soit la &lt;strong&gt;concaténation&lt;/strong&gt; des clés étrangères des entités en relation. Sinon cela n'a aucun intérêt. J'ai déjà pu voir très récemment des tables se voulant être des liens de &lt;a href=&quot;http://methylbro.titaxium.org/post/2008/11/09/Bases-de-Donnees-Relationnelles/Relations-Composition&quot;&gt;composition&lt;/a&gt; mais dont la &lt;strong&gt;clé primaire&lt;/strong&gt; est un champ complètement autonome. C'est à éviter à tout prix ! &lt;/p&gt;
&lt;code&gt;CREATE TABLE `LEGO__COMPOSER` (&lt;br /&gt;
`construction` int(11) NOT NULL,&lt;br /&gt;
`brique` int(11) NOT NULL,&lt;br /&gt;
`nombre` integer NOT NULL DEFAULT 1,&lt;br /&gt;&lt;br /&gt;
CONSTRAINT `construction_composer` FOREIGN KEY (`construction`)&lt;br /&gt;
REFERENCES `LEGO__CONSTRUCTION` (`id`)&lt;br /&gt;
ON DELETE RESTRICT ON UPDATE CASCADE,&lt;br /&gt;&lt;br /&gt;
CONSTRAINT `brique_composer` FOREIGN KEY (`brique`)&lt;br /&gt;
REFERENCES `LEGO__BRIQUE` (`id`)&lt;br /&gt;
ON DELETE RESTRICT ON UPDATE CASCADE,&lt;br /&gt;&lt;br /&gt;
PRIMARY KEY (`construction`, `brique`)&lt;br /&gt;
)TYPE=InnoDB;&lt;/code&gt;
&lt;p&gt;Comme vous pouvez le voir, cela nous permet de porter des données sur notre relation. Souvenez vous lorsque dans un billet précédant je vous parlez de &quot;&lt;a href=&quot;http://methylbro.titaxium.org/post/2008/11/09/Bases-de-Donnees-Relationnelles/Relations-Composition&quot;&gt;porteuse de données&lt;/a&gt;&quot;. Et bien voici ici comment cela se traduit concrètement (avec le champ &lt;em&gt;nombre&lt;/em&gt;).&lt;/p&gt;</description>
    
    
    
          <comments>http://methylbro.titaxium.org/post/2008/11/09/Bases-de-Donnees-Relationnelles-sql-create-table-constraint#comment-form</comments>
      <wfw:comment>http://methylbro.titaxium.org/post/2008/11/09/Bases-de-Donnees-Relationnelles-sql-create-table-constraint#comment-form</wfw:comment>
      <wfw:commentRss>http://methylbro.titaxium.org/feed/atom/comments/218</wfw:commentRss>
      </item>
    
  <item>
    <title>Bases de Données Relationnelles - Partie 3</title>
    <link>http://methylbro.titaxium.org/post/2008/11/09/Bases-de-Donnees-Relationnelles/Relations-Composition</link>
    <guid isPermaLink="false">urn:md5:2ecc0f92cb487514679432b03b070a64</guid>
    <pubDate>Sun, 09 Nov 2008 00:53:00 +0100</pubDate>
    <dc:creator>Méthylbro</dc:creator>
        <category>Tutoriels</category>
        <category>Base de Données</category><category>BDD</category><category>Composition</category><category>MySQL</category><category>Relation</category>    
    <description>&lt;p&gt;J'avais promis un tutoriel complet sur les principes simple de la création d'une Base de Données Relationnelle avec MySQL ...&lt;/p&gt;
&lt;p&gt;Et voilà qu'au bout d'un mois, à cause de beaucoup de boulot et d'un gros poil dans la main je m'apercois que je n'ai rédigé que deux articles à ce sujet.&lt;/p&gt;
&lt;p&gt;Je vais donc rattraper mon retard et vous proposer la suite. Aujourd'hui donc, après une Introduction au &lt;a href=&quot;http://methylbro.titaxium.org/post/2008/10/12/Bases-de-Donnees-Relationnelles&quot;&gt;Base de Données Relationnelle&lt;/a&gt; ainsi qu'un premier article expliquant le concept simple de l'&lt;a href=&quot;http://methylbro.titaxium.org/post/2008/10/13/Bases-de-Donnees-Relationnelles/Relations-Agregation&quot;&gt;agrégation&lt;/a&gt;, je vais essayer d'expliquer le principe de la &lt;strong&gt;composition&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Si vous ne comprenez pas tout de suite ou je veux en venir ne vous inquiétez pas, des exemples concrets arrivent dans les billets à venir.&lt;/p&gt;    &lt;h2&gt;Composition&lt;/h2&gt;
&lt;p&gt;De même que l’&lt;a href=&quot;http://methylbro.titaxium.org/post/2008/10/13/Bases-de-Donnees-Relationnelles/Relations-Agregation&quot;&gt;Agrégation&lt;/a&gt;, il existe un autre type de relation entre deux entités qui permet de composer des éléments de façon plus complexe.&lt;/p&gt;
&lt;p&gt;En effet, si l’&lt;a href=&quot;http://methylbro.titaxium.org/post/2008/10/13/Bases-de-Donnees-Relationnelles/Relations-Agregation&quot;&gt;Agrégation&lt;/a&gt; permet de modéliser au sein d’une base de données des liens unilatéraux entre des éléments elle deviens inutilisable dans des cas plus complexes. L’idée ici est de décrire qu’un élément A se &lt;strong&gt;compose&lt;/strong&gt; d’un ensemble d’éléments B. Inversement, cet élément B sera composé d’une série d’éléments A.&lt;/p&gt;
&lt;p&gt;Je sens que certains seront vite perdu avec ces explication hasardeuses, reprenons donc notre exemple de modélisation de constructions avec des Lego.&lt;/p&gt;
&lt;p&gt;Pour définir une construction en Lego, nous admettrons que celle-ci est en fait un ensemble de briques, de diverses tailles, formes et couleurs assemblés les unes aux autres. Ce qui au final nous donne notre construction. Il s’agit donc d’un lien de composition entre nos entités BRIQUE et CONSTRUCTION. &lt;/p&gt;
&lt;p&gt;Le modèle suivant décris ce comportement de façon simple : Une Construction est composée de Briques ou dans l’autre sens, un ensemble de Briques composent une Construction :&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img src=&quot;http://methylbro.titaxium.org/portfolio/methylbro/public/images/composition.gif&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Ici vous devez lire ce schéma de la façon suivante :&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;Une Construction est composée de 0 ou plusieurs Briques. &lt;br /&gt;
Une Brique entre dans la composition de 0 ou plusieurs Constructions.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;Porteuse de données&lt;/h3&gt;
&lt;p&gt;Cependant, la solution proposée imposera très vite ses limites pour certains cas. Par exemple ici, comment déterminer le nombre d’une même Brique nécessaire au sein d’une construction ?&lt;/p&gt;
&lt;p&gt;Car comme nous le verrons plus loin lors de la création de notre base de données, l’intérêt de modéliser correctement est d’atteindre une &lt;strong&gt;intégrité&lt;/strong&gt; parfaite de nos données. De ce fait il serait incongru de voir apparaitre une même occurrence de notre relation COMPOSER plusieurs fois. &lt;/p&gt;
&lt;p&gt;Pour ce faire, nous utiliserons un cas particulier de la &lt;strong&gt;Composition&lt;/strong&gt; : la relation &lt;strong&gt;porteuse de données&lt;/strong&gt;. Ce cas ne s’applique qu’exclusivement aux relations « Composées ». Si lors de vos modélisations vous vous retrouvez avec une &lt;a href=&quot;http://methylbro.titaxium.org/post/2008/10/13/Bases-de-Donnees-Relationnelles/Relations-Agregation&quot;&gt;Agrégation&lt;/a&gt; porteuse de données, c’est que vous avez commis une erreur et que la donnée portée par la relation doit en réalité s’appliqué au sein d’une des entités reliées. &lt;/p&gt;
&lt;p&gt;Pour illustrer le cas des relations &lt;strong&gt;porteuses de données&lt;/strong&gt;, nous allons modifier notre exemple précédant en y ajoutant ceci :&lt;/p&gt;
&lt;p&gt;Une Construction est composée de Briques. A chaque utilisation d’une brique dans notre construction, nous prendrons soin d’incrémenter la propriété « nombre » de la relation COMPOSER.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img src=&quot;http://methylbro.titaxium.org/portfolio/methylbro/public/images/porteuse_de_donnees.gif&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p style=&quot;text-align:right;&quot;&gt;&lt;a href=&quot;http://methylbro.titaxium.org/post/2008/11/09/Bases-de-Donnees-Relationnelles-sql-create-table-constraint&quot; title=&quot;Base de Données Relationnelle&quot;&gt;Lire la suite&lt;/a&gt;&lt;/p&gt;</description>
    
    
    
          <comments>http://methylbro.titaxium.org/post/2008/11/09/Bases-de-Donnees-Relationnelles/Relations-Composition#comment-form</comments>
      <wfw:comment>http://methylbro.titaxium.org/post/2008/11/09/Bases-de-Donnees-Relationnelles/Relations-Composition#comment-form</wfw:comment>
      <wfw:commentRss>http://methylbro.titaxium.org/feed/atom/comments/217</wfw:commentRss>
      </item>
    
  <item>
    <title>Bases de Données Relationnelles - Partie 2</title>
    <link>http://methylbro.titaxium.org/post/2008/10/13/Bases-de-Donnees-Relationnelles/Relations-Agregation</link>
    <guid isPermaLink="false">urn:md5:676eb145d905755386588770a0ca9727</guid>
    <pubDate>Mon, 13 Oct 2008 00:40:00 +0200</pubDate>
    <dc:creator>Méthylbro</dc:creator>
        <category>Tutoriels</category>
        <category>Agrégation</category><category>Base de Données</category><category>BDD</category><category>MySQL</category><category>propriété</category><category>Relation</category><category>relations</category><category>tables</category>    
    <description>&lt;p&gt;Deuxième billet dédié à la conception de &lt;a href=&quot;http://methylbro.titaxium.org/post/2008/10/12/Bases-de-Donnees-Relationnelles&quot;&gt;Base de Données Relationnelle&lt;/a&gt; avec MySQL.&lt;/p&gt;
&lt;p&gt;Dans ce billet nous aborderons le sujet très intéressant des différentes relations que peuvent avoir vos entités (vos tables) entre elles.&lt;/p&gt;    &lt;h1&gt;Bases de Données Relationnelles (suite)&lt;/h1&gt;
&lt;h2&gt;Relations&lt;/h2&gt;
&lt;p&gt;Le simple fait de stocker l’identifiant d'une &lt;strong&gt;occurrence&lt;/strong&gt; de &lt;strong&gt;table&lt;/strong&gt; comme &lt;strong&gt;propriété&lt;/strong&gt; d'une occurrence d’une autre table n’est pas suffisant en soit pour décrire une &lt;strong&gt;relation&lt;/strong&gt; entre les tables concernées. C’est une erreur ; une erreur extrêmement commune et répandue.&lt;/p&gt;
&lt;p&gt;Vous devez décrire correctement à votre &lt;em&gt;Système de Gestion de Base de Données&lt;/em&gt; le comportement naturel de vos entités et de leurs relations.&lt;/p&gt;
&lt;p&gt;Comme vous le savez, il est impératif que les données contenues dans vos bases soient les plus cohérentes possibles. Vous devrais alors prendre soin dés le début à ce que votre &lt;strong&gt;base de données&lt;/strong&gt; dans sa structure même n’accepte pas les incohérences les plus évidentes. &lt;/p&gt;
&lt;p&gt;Pour ce faire il faut d’abord être à l’aise avec les &lt;strong&gt;relations&lt;/strong&gt; que vous allez pouvoir rencontrer. &lt;/p&gt;
&lt;p&gt;Nous distinguerons deux types de relations : des relations « &lt;em&gt;d’appartenance&lt;/em&gt; », que nous appellerons &lt;strong&gt;Agrégations&lt;/strong&gt; ainsi que des relations de « &lt;em&gt;constitution&lt;/em&gt; », que nous appellerons &lt;strong&gt;Compositions&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;L’&lt;strong&gt;agrégation&lt;/strong&gt; et la &lt;strong&gt;composition&lt;/strong&gt; sont des concepts récurrents du génie logiciel. Vous les retrouverez à chaque fois que vous manipulerez des &lt;strong&gt;entités&lt;/strong&gt;. Qu’ils s’agissent de tables comme ici, mais aussi d’objets !&lt;/p&gt;
&lt;h3&gt;Agrégation&lt;/h3&gt;
&lt;p&gt;Sous ce nom un peut étrange se cache en fait le type de &lt;strong&gt;relation&lt;/strong&gt; le plus courant ; le plus simple à comprendre et donc, à utiliser.&lt;/p&gt;
&lt;p&gt;Une &lt;strong&gt;agrégation&lt;/strong&gt; décris un lien d’affiliation entre une entité A et une entité B. Il s’agit d’une &lt;strong&gt;relation&lt;/strong&gt; unilatérale, car elle n’est décrite que dans l’entité affiliée.&lt;/p&gt;
&lt;p&gt;Prenons par exemple des Catégories et des Articles. On peut naturellement dire qu’un article est affilié à une catégorie, car ce dernier sera contenu dans une catégorie. La catégorie quand à elle ne sait pas qu’elle contient cet article. Du moins pas directement car dans notre base de données, le lien entre l’article et sa catégorie est enregistré du coté de l’article.&lt;/p&gt;
&lt;p&gt;Reprenons notre exemple sur nos constructions en LEGO. Nous avons dit auparavant qu’un thème contenait des constructions. A fortiori une construction est affiliée à un thème.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img src=&quot;http://methylbro.titaxium.org/portfolio/methylbro/public/images/mcd_exemple_agregation.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Ici vous devez lire ce schéma de la façon suivante : &lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;« Une Construction est forcément affiliée à un Thème.&lt;br /&gt;
A un Thème est affilié 0 ou plusieurs Constructions. »&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Le plus simple, et le plus évident sera alors de stocker au sein de notre table CONSTRUCTION le numéro d’identifiant du thème à laquelle la construction est affiliée. Nous appellerons donc ce nouveau champ à stocker : une &lt;strong&gt;clé étrangère&lt;/strong&gt; (&lt;strong&gt;Foreign Key&lt;/strong&gt; en anglais).  &lt;br /&gt;&lt;strong&gt;
Clé étrangère&lt;/strong&gt; car faisant référence à la &lt;strong&gt;clé primaire&lt;/strong&gt; d’une &lt;strong&gt;occurrence&lt;/strong&gt; de la table THEME.&lt;/p&gt;
&lt;p&gt;Nous verrons plus loin comment décrire cette &lt;strong&gt;clé étrangère&lt;/strong&gt; lors de la création des tables de notre exemple. &lt;/p&gt;
&lt;p style=&quot;text-align: right;&quot;&gt;&lt;a href=&quot;http://methylbro.titaxium.org/post/2008/11/09/Bases-de-Donnees-Relationnelles/Relations-Composition&quot; title=&quot;Base de données Relationnelle - Composition&quot;&gt;Lire la suite&lt;/a&gt;&lt;/p&gt;</description>
    
    
    
          <comments>http://methylbro.titaxium.org/post/2008/10/13/Bases-de-Donnees-Relationnelles/Relations-Agregation#comment-form</comments>
      <wfw:comment>http://methylbro.titaxium.org/post/2008/10/13/Bases-de-Donnees-Relationnelles/Relations-Agregation#comment-form</wfw:comment>
      <wfw:commentRss>http://methylbro.titaxium.org/feed/atom/comments/203</wfw:commentRss>
      </item>
    
  <item>
    <title>Bases de Données Relationnelles</title>
    <link>http://methylbro.titaxium.org/post/2008/10/12/Bases-de-Donnees-Relationnelles</link>
    <guid isPermaLink="false">urn:md5:0aa6539d52ae62e9403c48c0a20f946a</guid>
    <pubDate>Sun, 12 Oct 2008 00:40:00 +0200</pubDate>
    <dc:creator>Méthylbro</dc:creator>
        <category>Tutoriels</category>
        <category>Base de Données</category><category>BDD</category><category>contrainte</category><category>MySQL</category><category>propriété</category><category>Relation</category><category>relations</category><category>SQL</category><category>tables</category>    
    <description>&lt;p&gt;Mon tutoriel sur la &lt;a href=&quot;http://methylbro.titaxium.org/post/2008/04/13/Introduction-a-la-POO-avec-PHP&quot; title=&quot;POO avec PHP&quot;&gt;Programmation Orienté Objet avec PHP&lt;/a&gt; ayant apparemment reçu de bonnes critiques, je me suis permis de croire que j’avais un sens didactique faisant mouche pour certaines personnes. &lt;/p&gt;
&lt;p&gt;Je vais donc remettre ca cette semaine en proposant un nouveau tutoriel à lire jours après jour. Avec pour thème cette fois les &lt;strong&gt;Bases de données&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;En effet, je vois trop souvent des applications sous estimant l’utilité d’utiliser une &lt;strong&gt;base de données&lt;/strong&gt; bien conçue. Pourtant, vous allez voir en lisant cette série d’articles que passer un peut de temps à concevoir ses &lt;strong&gt;tables&lt;/strong&gt; et à bien définir les &lt;strong&gt;relations&lt;/strong&gt; entre ces dernières n’est pas une perte de temps. &lt;/p&gt;
&lt;p&gt;Bien au contraire, une &lt;strong&gt;base de donnée&lt;/strong&gt; bien conçu vous permet de déléguer bon nombre de validations. Ainsi votre code &lt;a href=&quot;http://methylbro.titaxium.org/tag/php&quot; title=&quot;PHP&quot;&gt;PHP&lt;/a&gt; gagnera en lisibilité, en facilité de rédaction mais vous serez vous aussi gagnant en termes de temps. Car vous n’aurez pas à réécrire en &lt;a href=&quot;http://methylbro.titaxium.org/tag/php&quot; title=&quot;PHP&quot;&gt;PHP&lt;/a&gt; des séries de validations de données qui auraient pu être fait en amont, directement au sein de votre &lt;strong&gt;base de données&lt;/strong&gt;.&lt;/p&gt;    &lt;h1&gt;Bases de Données Relationnelles&lt;/h1&gt;
&lt;h2&gt;Introduction avec MySQL&lt;/h2&gt;
&lt;p&gt;En génie logiciel il est communément admis qu’une application est un ensemble composé de données et de traitements. C’est d’ailleurs un des fondements des méthodes de conception (MVC, PAC etc…).&lt;/p&gt;
&lt;p&gt;Or trop souvent les développeurs web ont tendance à négliger la conception de leur &lt;strong&gt;base de données&lt;/strong&gt;. Pour la plupart d’entre eux le concept d’une base de données se résume en un ensemble abstrait de tableaux qui n’ont comme seul intérêt qu’une &lt;em&gt;lecture/écriture&lt;/em&gt; simplifié. &lt;/p&gt;
&lt;p&gt;Bien entendu certains d’entre eux comprennent qu’une base de données bien conçue apportera la réponse à leurs questions. Mais je me suis aperçu que dans la grande majorité des cas, ils ne savent pas comment traduire ces &lt;strong&gt;relations&lt;/strong&gt; dans leurs bases de données voire parfois, ils ne savent même pas les mettre en œuvre concrètement. Sans compter que l'on peut les entendre parler de &lt;strong&gt;tables&lt;/strong&gt; « &lt;em&gt;associatives&lt;/em&gt; » ou d’autres inepties de ce genre.&lt;/p&gt;
&lt;p&gt;Nous allons donc voir comment concevoir des &lt;strong&gt;Bases de Données  Relationnelles&lt;/strong&gt;. Nous aborderons les concepts généraux inhérents à ces questions puis nous les nommerons correctement. D’abord avec un peut de théorie puis ensuite illustré par un cas pratique utilisant &lt;strong&gt;MySQL&lt;/strong&gt;.&lt;/p&gt;
&lt;h2&gt;Introduction&lt;/h2&gt;
&lt;h3&gt;Prés requis&lt;/h3&gt;
&lt;p&gt;Ce tutoriel n’est pas destiné aux débutants. Il s’adresse plus aux amateurs, ou à tout développeur ayant quelques difficultés avec les concepts évoqués ici. &lt;/p&gt;
&lt;p&gt;Il est indispensable pour comprendre ce que je vais évoquer plus loin de maitriser les commandes de base en &lt;strong&gt;SQL&lt;/strong&gt;. C'est-à-dire &lt;em&gt;CREATE TABLE&lt;/em&gt;, &lt;em&gt;ALTER TABLE&lt;/em&gt;, &lt;em&gt;INSERT&lt;/em&gt;, &lt;em&gt;UPDATE&lt;/em&gt;, &lt;em&gt;SELECT&lt;/em&gt;, &lt;em&gt;UPDATE&lt;/em&gt; …&lt;/p&gt;
&lt;p&gt;Il est aussi souhaitable de connaitre les différents &lt;strong&gt;types de données&lt;/strong&gt; simple qui peuvent être déclarés, ainsi que les concepts de &lt;strong&gt;clés primaires&lt;/strong&gt;, &lt;strong&gt;contraintes d’unicité&lt;/strong&gt; et même le principe de &lt;strong&gt;contraintes&lt;/strong&gt; dans son ensemble même si je reviendrais un peu sur ces derniers. &lt;/p&gt;
&lt;h3&gt;Comparaison avec des bases de données non relationnelles&lt;/h3&gt;
&lt;p&gt;Comme je l’ai dit plus haut, il est extrêmement simple de s’imaginer une table comme un grand tableau à deux entrées. Il est ainsi possible d’y stocker n’importe quel type d’informations. &lt;/p&gt;
&lt;p&gt;En développement web il peut s’agir par exemple d’une liste d’articles, de la liste des membres inscrits sur votre site. Ou bien encore de la liste des abonnés à votre liste de diffusion. &lt;/p&gt;
&lt;p&gt;Néanmoins, vous avez déjà du rencontrer des problèmes pour relier toutes ces informations entre elles. Par exemple, votre site est divisé en X catégories. Chacune de vos catégories peut contenir divers articles. Comment stocker ce lien hiérarchique entre vos catégories et vos articles ?&lt;/p&gt;
&lt;p&gt;Ou mieux encore, les catégories sur plusieurs niveaux. Comment faire pour enregistrer un lien hiérarchique entre vos catégories, vos sous-catégories, vos sous sous-catégories et ainsi de suite ? Sans forcément avoir à créer de nouvelles tables à chaque niveau de votre arborescence ?&lt;/p&gt;
&lt;p&gt;Voilà ce que nous allons apprendre à faire correctement, et proprement dans ce tutoriel. &lt;/p&gt;
&lt;h3&gt;Exemple employé&lt;/h3&gt;
&lt;p&gt;Dans cet article nous allons créer une &lt;strong&gt;base de données&lt;/strong&gt; qui enchantera les amateurs de LEGO. &lt;/p&gt;
&lt;p&gt;En effet, on peut très simplement avoir une base de données concernant un ensemble de constructions et LEGO. Voire même en poussant un peu plus l’exemple, créer un système permettant aux constructeur en herbe de sauvegarder les plans de leur créations. &lt;/p&gt;
&lt;p&gt;Nous admettrons donc qu’une construction en LEGO &lt;em&gt;est composée&lt;/em&gt; d’un ensemble de pièces. Afin de simplifier nous ne gérerons pas les différentes couleurs que peuvent avoir ses pièces, mais simplement leur forme ou leur taille ainsi que la quantité de chaque pièce utilisée pour notre construction.
Nous verrons aussi comment &lt;em&gt;classer&lt;/em&gt; toutes nos constructions par thèmes. &lt;/p&gt;
&lt;p style=&quot;text-align: right;&quot;&gt;&lt;a href=&quot;http://methylbro.titaxium.org/post/2008/10/13/Bases-de-Donnees-Relationnelles/Relations-Agregation&quot; title=&quot;Base de Données Relationnelle - Agrégation&quot;&gt;Lire la suite&lt;/a&gt;&lt;/p&gt;</description>
    
    
    
          <comments>http://methylbro.titaxium.org/post/2008/10/12/Bases-de-Donnees-Relationnelles#comment-form</comments>
      <wfw:comment>http://methylbro.titaxium.org/post/2008/10/12/Bases-de-Donnees-Relationnelles#comment-form</wfw:comment>
      <wfw:commentRss>http://methylbro.titaxium.org/feed/atom/comments/202</wfw:commentRss>
      </item>
    
</channel>
</rss>