{"id":991,"date":"2015-04-17T10:12:20","date_gmt":"2015-04-17T08:12:20","guid":{"rendered":"http:\/\/www.lafabriquedecode.com\/blog\/?p=991"},"modified":"2015-04-17T10:12:20","modified_gmt":"2015-04-17T08:12:20","slug":"les-formes-normales-bases-de-donnees","status":"publish","type":"post","link":"http:\/\/www.lafabriquedecode.com\/blog\/2015\/04\/les-formes-normales-bases-de-donnees\/","title":{"rendered":"Les formes normales"},"content":{"rendered":"<h1>Relation, es-tu bien normale ?<\/h1>\n<p>Le but de la <strong>normalisation<\/strong> d&rsquo;un sch\u00e9ma de base de donn\u00e9es relationnelle ? Principalement l&rsquo;<strong>\u00e9limination de la redondance<\/strong> et l&rsquo;assurance d&rsquo;avoir des <strong>donn\u00e9es coh\u00e9rentes<\/strong> (pas la m\u00eame adresse orthographi\u00e9e de N fa\u00e7ons diff\u00e9rentes, par exemple). Je dis \u00ab\u00a0de la redondance inutile\u00a0\u00bb car m\u00eame si cela semble un pl\u00e9onasme, il existe des cas o\u00f9 elle peut avoir une utilit\u00e9 et notamment quand la rapidit\u00e9 des acc\u00e8s aux donn\u00e9es est plac\u00e9e au centre des pr\u00e9occupations du concepteur.<\/p>\n<div id=\"attachment_1017\" style=\"width: 510px\" class=\"wp-caption alignnone\"><a href=\"http:\/\/www.lafabriquedecode.com\/blog\/wp-content\/uploads\/2015\/04\/61368205.jpg\"><img aria-describedby=\"caption-attachment-1017\" loading=\"lazy\" class=\"wp-image-1017 size-full\" src=\"http:\/\/www.lafabriquedecode.com\/blog\/wp-content\/uploads\/2015\/04\/61368205.jpg\" alt=\"normaliser\" width=\"500\" height=\"451\" srcset=\"http:\/\/www.lafabriquedecode.com\/blog\/wp-content\/uploads\/2015\/04\/61368205.jpg 500w, http:\/\/www.lafabriquedecode.com\/blog\/wp-content\/uploads\/2015\/04\/61368205-300x271.jpg 300w\" sizes=\"(max-width: 500px) 100vw, 500px\" \/><\/a><p id=\"caption-attachment-1017\" class=\"wp-caption-text\">Normalisez avant qu&rsquo;il ne faille tout jeter !<\/p><\/div>\n<h1>Les formes normales, des r\u00e8gles \u00e0 suivre pour rester en forme !<\/h1>\n<p>Les <strong>formes normales<\/strong> sont des r\u00e8gles \u00e0 suivre pour parvenir \u00e0 \u00e9liminer cette redondance inutile. Nous n&rsquo;irons pas en d\u00e9tail dans les aspects formels de ces formes normales, parce qu&rsquo;ils ne sont pas indispensables \u00e0 la compr\u00e9hension de celles-ci et parce qu&rsquo;ils rebutent inutilement le d\u00e9butant. Sim-pli-ci-t\u00e9 !<\/p>\n<h1>1NF<\/h1>\n<p>Que nous dit cette premi\u00e8re forme normale (<em>1st Normal Form<\/em>) ? Elle nous dit que tout attribut d&rsquo;une relation (toute colonne d&rsquo;une table, si vous pr\u00e9f\u00e9rez) ne doit poss\u00e9der qu&rsquo;une valeur pour chacun de ses enregistrements (ou tuples).<\/p>\n<p>Plus concr\u00e8tement, voici une table <strong>enseignant<\/strong> qui viole all\u00e9grement 1NF :<\/p>\n<p><a href=\"http:\/\/www.lafabriquedecode.com\/blog\/wp-content\/uploads\/2015\/04\/restaurant_a_refaire1.png\"><img loading=\"lazy\" class=\"size-full wp-image-993\" src=\"http:\/\/www.lafabriquedecode.com\/blog\/wp-content\/uploads\/2015\/04\/restaurant_a_refaire1.png\" alt=\"Table violant 1NF\" width=\"310\" height=\"86\" srcset=\"http:\/\/www.lafabriquedecode.com\/blog\/wp-content\/uploads\/2015\/04\/restaurant_a_refaire1.png 310w, http:\/\/www.lafabriquedecode.com\/blog\/wp-content\/uploads\/2015\/04\/restaurant_a_refaire1-300x83.png 300w\" sizes=\"(max-width: 310px) 100vw, 310px\" \/><\/a><\/p>\n<p>La colonne <em>prenom<\/em> contient deux valeurs, cette colonne n&rsquo;est donc pas <strong>mono-valu\u00e9e<\/strong> comme nous l&rsquo;impose 1NF mais <strong>multi-valu\u00e9e<\/strong>, on dit que <em>prenom<\/em> ne contient pas de valeur <em>atomique<\/em>, que c&rsquo;est un groupe de valeurs.<\/p>\n<h2>Comment se mettre en conformit\u00e9 avec 1NF ?<\/h2>\n<p>Dans notre cas ici, il ne faut pas faire l&rsquo;\u00e9conomie d&rsquo;une colonne d\u00e9di\u00e9e au deuxi\u00e8me pr\u00e9nom (il pourrait m\u00eame y en avoir un troisi\u00e8me, voire N car \u00ab\u00a0le nombre de pr\u00e9noms qui peuvent \u00eatre attribu\u00e9s par les parents \u00e0 un m\u00eame enfant n&rsquo;est pas fix\u00e9 par la loi\u00a0\u00bb nous dit le site <a title=\"Service Public\" href=\"http:\/\/vosdroits.service-public.fr\/particuliers\/F882.xhtml\" target=\"_blank\">Service Public<\/a>). Cr\u00e9ons donc cette nouvelle colonne et notons que la cr\u00e9ation de celle-ci nous permettra de faire des recherches de meilleure qualit\u00e9 sur les pr\u00e9noms, par exemple en utilisant un <a title=\"index\" href=\"http:\/\/www.lafabriquedecode.com\/blog\/2013\/04\/mysql-poser-un-index-qui-penalise-le-temps-dexecution\/\" target=\"_blank\">index<\/a> !<\/p>\n<p><a href=\"http:\/\/www.lafabriquedecode.com\/blog\/wp-content\/uploads\/2015\/04\/restaurant_a_refaire11.png\"><img loading=\"lazy\" class=\"alignnone size-full wp-image-994\" src=\"http:\/\/www.lafabriquedecode.com\/blog\/wp-content\/uploads\/2015\/04\/restaurant_a_refaire11.png\" alt=\"Table en conformit\u00e9 avec 1NF\" width=\"236\" height=\"79\" \/><\/a><\/p>\n<p>Plut\u00f4t simple, n&rsquo;est-ce pas ? Que dire de cette relation :<\/p>\n<p><a href=\"http:\/\/www.lafabriquedecode.com\/blog\/wp-content\/uploads\/2015\/04\/restaurant_a_refaire12.png\"><img loading=\"lazy\" class=\"size-full wp-image-996\" src=\"http:\/\/www.lafabriquedecode.com\/blog\/wp-content\/uploads\/2015\/04\/restaurant_a_refaire12.png\" alt=\"Table violant 1NF\" width=\"512\" height=\"84\" srcset=\"http:\/\/www.lafabriquedecode.com\/blog\/wp-content\/uploads\/2015\/04\/restaurant_a_refaire12.png 512w, http:\/\/www.lafabriquedecode.com\/blog\/wp-content\/uploads\/2015\/04\/restaurant_a_refaire12-300x49.png 300w\" sizes=\"(max-width: 512px) 100vw, 512px\" \/><\/a><\/p>\n<p>Encore une fois, notre colonne adresse est multi-valu\u00e9e ! M\u00eame si elle ne contient qu&rsquo;une seule adresse, cette adresse elle-m\u00eame contient plusieurs informations, de nature diff\u00e9rente: un nom de rue, un num\u00e9ro dans cette rue, un code postal, un nom de ville&#8230;Pourquoi ne pas cr\u00e9er une table adresse avec un champ <em>numero<\/em>, <em>type_voie<\/em> (rue, avenue, boulevard etc.), <em>code_postal<\/em>, <em>ville<\/em> etc. ? Cela peut servir si l&rsquo;on veut normaliser nos adresses gr\u00e2ce \u00e0 des outils tierce-partie et les rendre \u00ab\u00a0propres\u00a0\u00bb. Parfois il arrive que l&rsquo;on laisse volontairement l&rsquo;adresse dans cet \u00e9tat pour minimiser les jointures et donc acc\u00e9der le plus rapidement possible \u00e0 l&rsquo;information&#8230;A vous d&rsquo;\u00e9tudier la pertinence de chacune de ces fa\u00e7ons de faire : gardez simplement \u00e0 l&rsquo;esprit que l&rsquo;absence de normalisation peut co\u00fbter cher plus tard&#8230;quand les donn\u00e9es auront enfl\u00e9 !<\/p>\n<h1>2NF<\/h1>\n<p>Tout d&rsquo;abord, pour \u00eatre en 2NF, il faut \u00eatre en 1NF : on ne peut pas \u00eatre sans avoir \u00e9t\u00e9, lorsque l&rsquo;on normalise ! Pour \u00e9voquer 2NF, il nous faut parler des <strong>d\u00e9pendances fonctionnelles<\/strong> ! Qu&rsquo;est-ce qu&rsquo;une DF ? Rien de bien compliqu\u00e9, regardons de plus pr\u00e8s cette relation <em>enseigne<\/em> :<\/p>\n<p><a href=\"http:\/\/www.lafabriquedecode.com\/blog\/wp-content\/uploads\/2015\/04\/restaurant_a_refaire13.png\"><img loading=\"lazy\" class=\"alignnone size-full wp-image-999\" src=\"http:\/\/www.lafabriquedecode.com\/blog\/wp-content\/uploads\/2015\/04\/restaurant_a_refaire13.png\" alt=\"2nf\" width=\"390\" height=\"106\" srcset=\"http:\/\/www.lafabriquedecode.com\/blog\/wp-content\/uploads\/2015\/04\/restaurant_a_refaire13.png 390w, http:\/\/www.lafabriquedecode.com\/blog\/wp-content\/uploads\/2015\/04\/restaurant_a_refaire13-300x82.png 300w\" sizes=\"(max-width: 390px) 100vw, 390px\" \/><\/a><\/p>\n<p>Nous avons ici une <strong>cl\u00e9 primaire compos\u00e9e<\/strong> du couple (identifiant_enseignant, identifiant_cours). Notre colonne <em>ville<\/em> nous dit dans quelle ville a lieu le cours.<br \/>\nNous voyons que la colonne ville <em>d\u00e9pend<\/em> de identifiant_cours : le cours 1 est toujours donn\u00e9 \u00e0 Avignon et le 2, toujours \u00e0 Aix.<\/p>\n<p>On dit ici que identifiant_cours <strong>d\u00e9termine<\/strong> <em>ville<\/em> ou bien, dans le sens inverse, que ville<em> d\u00e9pend fonctionnellement<\/em> de identifiant_cours.<\/p>\n<blockquote><p>Si pour des valeurs identiques d&rsquo;une colonne C on a les m\u00eames valeurs dans la colonne C2, alors C d\u00e9termine C2 et nous le noterons C \u2192 C2.<\/p><\/blockquote>\n<p>Ici, pour la valeur 1 dans la colonne identifiant_cours nous avons toujours la valeur Avignon en face et pour la valeur 2 dans la colonne identifiant_cours nous avons toujours la valeur Aix. Ce n&rsquo;est pas le cas de identifiant_enseignant, qui n&rsquo;a pas les m\u00eames valeurs de ville en face (regardez l&rsquo;enseignant 1, il enseigne dans la ville d&rsquo;Aix et dans la ville d&rsquo;Avignon).<\/p>\n<p>Dans notre relation <em>enseigne<\/em> nous distinguons:<\/p>\n<ul>\n<li>des attributs (des colonnes, c&rsquo;est pareil) qui forment une cl\u00e9 primaire<\/li>\n<li>un attribut non cl\u00e9 (ville)<\/li>\n<\/ul>\n<p>Ici nous avons identifi\u00e9 une <strong>d\u00e9pendance fonctionnelle<\/strong> entre une partie de la cl\u00e9 (la colonne <em>identifiant_cours<\/em>) et une colonne non cl\u00e9 (<em>ville<\/em>). Voil\u00e0 pourquoi <strong>cette relation viole 2NF<\/strong>.<\/p>\n<blockquote><p>Pour qu&rsquo;une relation soit conforme \u00e0 2NF, les attributs non cl\u00e9 de cette relation doivent d\u00e9pendre fonctionnellement de toute la cl\u00e9 et non d&rsquo;une partie seulement<\/p><\/blockquote>\n<p>Ici nous avions : <strong>identifiant_cours \u2192 ville<\/strong>. La colonne identifiant_cours est une partie (la moiti\u00e9 pour \u00eatre parfaitement exact) de la cl\u00e9. CQFD.<\/p>\n<h2>Comment se mettre en conformit\u00e9 avec 2NF ?<\/h2>\n<p>Nous allons isoler la DF <em>identifiant_cours \u2192 ville<\/em> qui nous pose probl\u00e8me dans sa propre table, que nous pourrions appeler <strong>cours<\/strong> par exemple :<\/p>\n<p><a href=\"http:\/\/www.lafabriquedecode.com\/blog\/wp-content\/uploads\/2015\/04\/restaurant_a_refaire15.png\"><img loading=\"lazy\" class=\"alignnone size-full wp-image-1006\" src=\"http:\/\/www.lafabriquedecode.com\/blog\/wp-content\/uploads\/2015\/04\/restaurant_a_refaire15.png\" alt=\"2nf-bis\" width=\"199\" height=\"72\" \/><\/a><\/p>\n<p>Vous noterez que nous avons mis fin \u00e0 la redondance inutile jusqu&rsquo;alors pr\u00e9sente dans la table (la ville potentiellement r\u00e9p\u00e9t\u00e9e N fois); cela nous aide aussi \u00e0 assurer comme je vous l&rsquo;ai dit en introduction la coh\u00e9rence des donn\u00e9es (que se serait-il pass\u00e9 avant si nous avions \u00e9crit Avignon \u00ab\u00a0Avinion\u00a0\u00bb, \u00ab\u00a0Avignom\u00a0\u00bb et \u00ab\u00a0Avignon\u00a0\u00bb ? Nous aurions eu trois villes diff\u00e9rentes !). Dor\u00e9navant, Avignon figure une fois et une seule&#8230;et le nom est \u00e9crit comme il faut.<\/p>\n<p>Que va devenir notre ancienne relation ? Eh bien oui, nous l&rsquo;avons quelque peu rabot\u00e9e !<\/p>\n<p><a href=\"http:\/\/www.lafabriquedecode.com\/blog\/wp-content\/uploads\/2015\/04\/restaurant_a_refaire16.png\"><img loading=\"lazy\" class=\"alignnone size-full wp-image-1007\" src=\"http:\/\/www.lafabriquedecode.com\/blog\/wp-content\/uploads\/2015\/04\/restaurant_a_refaire16.png\" alt=\"2nf3\" width=\"327\" height=\"99\" srcset=\"http:\/\/www.lafabriquedecode.com\/blog\/wp-content\/uploads\/2015\/04\/restaurant_a_refaire16.png 327w, http:\/\/www.lafabriquedecode.com\/blog\/wp-content\/uploads\/2015\/04\/restaurant_a_refaire16-300x91.png 300w\" sizes=\"(max-width: 327px) 100vw, 327px\" \/><\/a><\/p>\n<p>Nous avons sorti <em>ville<\/em> mais il nous faut bien garder le lien entre le cours et la ville, voil\u00e0 pourquoi la <strong>source<\/strong> de la DF <strong>identifiant_cours \u2192 ville<\/strong>, c&rsquo;est \u00e0 dire identifiant_cours, RESTE dans la table d&rsquo;origine. Gr\u00e2ce \u00e0 identifiant_cours, qui existe maintenant dans les deux tables, nous pouvons effectuer des jointures et ainsi garantir qu&rsquo;on a maintenu l&rsquo;information initiale qui \u00e9tait \u00ab\u00a0tel cours se donne dans telle ville\u00a0\u00bb.<\/p>\n<p><em>En pratique ici, identifiant_cours sera cl\u00e9 primaire dans la nouvelle table <strong>cours<\/strong> et une contrainte d&rsquo;int\u00e9grit\u00e9 r\u00e9f\u00e9rentielle partira depuis identifiant_cours situ\u00e9 dans <strong>enseigne<\/strong> vers identifiant_cours situ\u00e9 dans <strong>cours<\/strong>.<\/em><\/p>\n<h1>3NF<\/h1>\n<p>Tout comme il nous faut \u00eatre en 1NF pour \u00eatre en 2NF, il nous faut \u00eatre en 2NF pour \u00eatre en 3NF : nous proc\u00e9dons de mani\u00e8re incr\u00e9mentale !<\/p>\n<blockquote><p>Pour \u00eatre en 3NF, il faut que toute colonne non cl\u00e9 ne d\u00e9pende que de la cl\u00e9 de la relation<\/p><\/blockquote>\n<p>Revenons un instant \u00e0 nos enseignants, dont la structure a quelque peu \u00e9volu\u00e9 :<\/p>\n<p><a href=\"http:\/\/www.lafabriquedecode.com\/blog\/wp-content\/uploads\/2015\/04\/restaurant_a_refaire17.png\"><img loading=\"lazy\" class=\"alignnone size-full wp-image-1009\" src=\"http:\/\/www.lafabriquedecode.com\/blog\/wp-content\/uploads\/2015\/04\/restaurant_a_refaire17.png\" alt=\"3nf\" width=\"558\" height=\"142\" srcset=\"http:\/\/www.lafabriquedecode.com\/blog\/wp-content\/uploads\/2015\/04\/restaurant_a_refaire17.png 558w, http:\/\/www.lafabriquedecode.com\/blog\/wp-content\/uploads\/2015\/04\/restaurant_a_refaire17-300x76.png 300w\" sizes=\"(max-width: 558px) 100vw, 558px\" \/><\/a><\/p>\n<p>Nous avons souhait\u00e9 pour chaque enseignant dire \u00e0 quel d\u00e9partement il \u00e9tait rattach\u00e9 et o\u00f9 ce dernier se situait. Dans le cas pr\u00e9sent, <strong>localisation d\u00e9pend de departement<\/strong> (not\u00e9 departement \u2192 localisation). Notre attribut <em>departement<\/em> ne fait pas partie de la cl\u00e9, pas plus que localisation, dont il d\u00e9pend. <strong>Voil\u00e0 pourquoi cette relation n&rsquo;est pas conforme \u00e0 3NF<\/strong> !<\/p>\n<p>Les probl\u00e8mes pos\u00e9s par cet exemple sont les m\u00eames que pour la 2NF, \u00e0 savoir :<\/p>\n<ul>\n<li>la localisation du d\u00e9partement est r\u00e9p\u00e9t\u00e9e dans chaque enregistrement (regardez les deux premiers) et elle peut aussi \u00eatre orthographi\u00e9e diff\u00e9remment suite \u00e0 une erreur de saisie, compromettant ainsi la coh\u00e9rence des donn\u00e9es et donc leur qualit\u00e9<\/li>\n<li>si la localisation du d\u00e9partement change, il faut mettre \u00e0 jour tous les enseignants qui y travaillent<\/li>\n<li>Si le d\u00e9partement n&rsquo;a plus d&rsquo;enseignant, nous perdons l&rsquo;information de sa localisation<\/li>\n<\/ul>\n<h2>Comment se mettre en conformit\u00e9 avec 3NF ?<\/h2>\n<p>Comme pour 2NF, il va nous falloir isoler la DF anormale <strong>departement \u2192 localisation<\/strong> dans sa propre table, comme ceci :<\/p>\n<p><a href=\"http:\/\/www.lafabriquedecode.com\/blog\/wp-content\/uploads\/2015\/04\/restaurant_a_refaire18.png\"><img loading=\"lazy\" class=\"alignnone size-full wp-image-1011\" src=\"http:\/\/www.lafabriquedecode.com\/blog\/wp-content\/uploads\/2015\/04\/restaurant_a_refaire18.png\" alt=\"3nf2\" width=\"297\" height=\"112\" \/><\/a><\/p>\n<p>L\u00e0 encore vous noterez que nous avons mis fin \u00e0 la redondance qui jusque l\u00e0 existait dans notre table. Notre relation <strong>enseignant<\/strong> va \u00ab\u00a0maigrir\u00a0\u00bb elle aussi mais on doit \u00e9galement y faire exister un lien vers notre nouvelle relation, ce lien ce sera la colonne identifiant_departement :<\/p>\n<p><a href=\"http:\/\/www.lafabriquedecode.com\/blog\/wp-content\/uploads\/2015\/04\/restaurant_a_refaire19.png\"><img loading=\"lazy\" class=\"alignnone size-full wp-image-1012\" src=\"http:\/\/www.lafabriquedecode.com\/blog\/wp-content\/uploads\/2015\/04\/restaurant_a_refaire19.png\" alt=\"3nf3\" width=\"523\" height=\"141\" srcset=\"http:\/\/www.lafabriquedecode.com\/blog\/wp-content\/uploads\/2015\/04\/restaurant_a_refaire19.png 523w, http:\/\/www.lafabriquedecode.com\/blog\/wp-content\/uploads\/2015\/04\/restaurant_a_refaire19-300x81.png 300w\" sizes=\"(max-width: 523px) 100vw, 523px\" \/><\/a><\/p>\n<h1>Conclusion<\/h1>\n<h2>Nous entretenons d\u00e9sormais des relations tout \u00e0 fait normales !<\/h2>\n<p>En r\u00e9alit\u00e9, il existe d&rsquo;autres formes normales apr\u00e8s 3NF, mais quand on a normalis\u00e9 en 3NF, on a d\u00e9j\u00e0 \u00e9limin\u00e9 la grande partie de ces vilaines redondances que nous voulons \u00e9viter.<\/p>\n<p>Pour retenir facilement 2NF et 3NF, les gens qui travaillent sur les bases de donn\u00e9es connaissent par c\u0153ur cette phrase de feu <a title=\"William Kent\" href=\"http:\/\/www.bkent.net\/http:\/\/\">William Kent<\/a> :<\/p>\n<blockquote><p>\u00ab\u00a0The key, the whole key, and nothing but the key\u00a0\u00bb<\/p><\/blockquote>\n<p>qui reprend de fa\u00e7on assez humoristique le serment que font les t\u00e9moins devant un tribunal : \u00ab\u00a0Je jure de dire la v\u00e9rit\u00e9, toute la v\u00e9rit\u00e9, rien que la v\u00e9rit\u00e9\u00a0\u00bb (des petits malins on rajout\u00e9 \u00ab\u00a0So help me Codd\u00a0\u00bb &#8211; E.F Codd \u00e9tant consid\u00e9r\u00e9 comme le p\u00e8re des bases de donn\u00e9es relationnelles &#8211; pour remplacer le \u00ab\u00a0so help me God\u00a0\u00bb (Dieu me vienne en aide) qui termine la phrase aux Etats-Unis).<\/p>\n<p>En effet :<\/p>\n<ul>\n<li>En <strong>2NF<\/strong>, tout attribut (ou colonne) non cl\u00e9 doit d\u00e9pendre de la cl\u00e9 toute enti\u00e8re (<em>the whole key<\/em>)<\/li>\n<li>En <strong>3NF<\/strong>, tout attribut (ou colonne) non cl\u00e9 ne doit d\u00e9pendre QUE de la cl\u00e9 (<em>nothing but the key<\/em>)<\/li>\n<\/ul>\n<p>Vous voil\u00e0 maintenant arm\u00e9s pour partir \u00e0 l&rsquo;assaut de vos tables et les normaliser ! Bon courage !<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Relation, es-tu bien normale ? Le but de la normalisation d&rsquo;un sch\u00e9ma de base de donn\u00e9es relationnelle ? Principalement l&rsquo;\u00e9limination de la redondance et l&rsquo;assurance d&rsquo;avoir des donn\u00e9es coh\u00e9rentes (pas la m\u00eame adresse orthographi\u00e9e de N fa\u00e7ons diff\u00e9rentes, par exemple). Je dis \u00ab\u00a0de la redondance inutile\u00a0\u00bb car m\u00eame si cela semble un pl\u00e9onasme, il existe [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0},"categories":[78,2],"tags":[79,80,84,85,81,82,83],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v19.6.1 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Les formes normales - La Fabrique de code - Tech blog<\/title>\n<meta name=\"description\" content=\"Les trois premi\u00e8res formes normales expliqu\u00e9es aux d\u00e9veloppeurs qui s&#039;int\u00e9ressent \u00e0 la normalisation des bases de donn\u00e9es relationnelles.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"http:\/\/www.lafabriquedecode.com\/blog\/2015\/04\/les-formes-normales-bases-de-donnees\/\" \/>\n<meta property=\"og:locale\" content=\"fr_FR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Les formes normales - La Fabrique de code - Tech blog\" \/>\n<meta property=\"og:description\" content=\"Les trois premi\u00e8res formes normales expliqu\u00e9es aux d\u00e9veloppeurs qui s&#039;int\u00e9ressent \u00e0 la normalisation des bases de donn\u00e9es relationnelles.\" \/>\n<meta property=\"og:url\" content=\"http:\/\/www.lafabriquedecode.com\/blog\/2015\/04\/les-formes-normales-bases-de-donnees\/\" \/>\n<meta property=\"og:site_name\" content=\"La Fabrique de code - Tech blog\" \/>\n<meta property=\"article:published_time\" content=\"2015-04-17T08:12:20+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/www.lafabriquedecode.com\/blog\/wp-content\/uploads\/2015\/04\/61368205.jpg\" \/>\n<meta name=\"author\" content=\"admin\" \/>\n<meta name=\"twitter:card\" content=\"summary\" \/>\n<meta name=\"twitter:creator\" content=\"@LaFabrique2Code\" \/>\n<meta name=\"twitter:site\" content=\"@LaFabrique2Code\" \/>\n<meta name=\"twitter:label1\" content=\"\u00c9crit par\" \/>\n\t<meta name=\"twitter:data1\" content=\"admin\" \/>\n\t<meta name=\"twitter:label2\" content=\"Dur\u00e9e de lecture estim\u00e9e\" \/>\n\t<meta name=\"twitter:data2\" content=\"8 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"http:\/\/www.lafabriquedecode.com\/blog\/2015\/04\/les-formes-normales-bases-de-donnees\/\",\"url\":\"http:\/\/www.lafabriquedecode.com\/blog\/2015\/04\/les-formes-normales-bases-de-donnees\/\",\"name\":\"Les formes normales - La Fabrique de code - Tech blog\",\"isPartOf\":{\"@id\":\"http:\/\/www.lafabriquedecode.com\/blog\/#website\"},\"datePublished\":\"2015-04-17T08:12:20+00:00\",\"dateModified\":\"2015-04-17T08:12:20+00:00\",\"author\":{\"@id\":\"http:\/\/www.lafabriquedecode.com\/blog\/#\/schema\/person\/83863c048b82fd9ccf6407bddd241162\"},\"description\":\"Les trois premi\u00e8res formes normales expliqu\u00e9es aux d\u00e9veloppeurs qui s'int\u00e9ressent \u00e0 la normalisation des bases de donn\u00e9es relationnelles.\",\"breadcrumb\":{\"@id\":\"http:\/\/www.lafabriquedecode.com\/blog\/2015\/04\/les-formes-normales-bases-de-donnees\/#breadcrumb\"},\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"http:\/\/www.lafabriquedecode.com\/blog\/2015\/04\/les-formes-normales-bases-de-donnees\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"http:\/\/www.lafabriquedecode.com\/blog\/2015\/04\/les-formes-normales-bases-de-donnees\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"http:\/\/www.lafabriquedecode.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Les formes normales\"}]},{\"@type\":\"WebSite\",\"@id\":\"http:\/\/www.lafabriquedecode.com\/blog\/#website\",\"url\":\"http:\/\/www.lafabriquedecode.com\/blog\/\",\"name\":\"La Fabrique de code - Tech blog\",\"description\":\"PHP objet, MySQL, Design Patterns, OOP...et plus !\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"http:\/\/www.lafabriquedecode.com\/blog\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"fr-FR\"},{\"@type\":\"Person\",\"@id\":\"http:\/\/www.lafabriquedecode.com\/blog\/#\/schema\/person\/83863c048b82fd9ccf6407bddd241162\",\"name\":\"admin\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"http:\/\/www.lafabriquedecode.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"http:\/\/0.gravatar.com\/avatar\/fc2e1de7c8a1871b50ff9c6a6f8682a2?s=96&d=retro&r=g\",\"contentUrl\":\"http:\/\/0.gravatar.com\/avatar\/fc2e1de7c8a1871b50ff9c6a6f8682a2?s=96&d=retro&r=g\",\"caption\":\"admin\"},\"url\":\"http:\/\/www.lafabriquedecode.com\/blog\/author\/admin\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Les formes normales - La Fabrique de code - Tech blog","description":"Les trois premi\u00e8res formes normales expliqu\u00e9es aux d\u00e9veloppeurs qui s'int\u00e9ressent \u00e0 la normalisation des bases de donn\u00e9es relationnelles.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"http:\/\/www.lafabriquedecode.com\/blog\/2015\/04\/les-formes-normales-bases-de-donnees\/","og_locale":"fr_FR","og_type":"article","og_title":"Les formes normales - La Fabrique de code - Tech blog","og_description":"Les trois premi\u00e8res formes normales expliqu\u00e9es aux d\u00e9veloppeurs qui s'int\u00e9ressent \u00e0 la normalisation des bases de donn\u00e9es relationnelles.","og_url":"http:\/\/www.lafabriquedecode.com\/blog\/2015\/04\/les-formes-normales-bases-de-donnees\/","og_site_name":"La Fabrique de code - Tech blog","article_published_time":"2015-04-17T08:12:20+00:00","og_image":[{"url":"http:\/\/www.lafabriquedecode.com\/blog\/wp-content\/uploads\/2015\/04\/61368205.jpg"}],"author":"admin","twitter_card":"summary","twitter_creator":"@LaFabrique2Code","twitter_site":"@LaFabrique2Code","twitter_misc":{"\u00c9crit par":"admin","Dur\u00e9e de lecture estim\u00e9e":"8 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"http:\/\/www.lafabriquedecode.com\/blog\/2015\/04\/les-formes-normales-bases-de-donnees\/","url":"http:\/\/www.lafabriquedecode.com\/blog\/2015\/04\/les-formes-normales-bases-de-donnees\/","name":"Les formes normales - La Fabrique de code - Tech blog","isPartOf":{"@id":"http:\/\/www.lafabriquedecode.com\/blog\/#website"},"datePublished":"2015-04-17T08:12:20+00:00","dateModified":"2015-04-17T08:12:20+00:00","author":{"@id":"http:\/\/www.lafabriquedecode.com\/blog\/#\/schema\/person\/83863c048b82fd9ccf6407bddd241162"},"description":"Les trois premi\u00e8res formes normales expliqu\u00e9es aux d\u00e9veloppeurs qui s'int\u00e9ressent \u00e0 la normalisation des bases de donn\u00e9es relationnelles.","breadcrumb":{"@id":"http:\/\/www.lafabriquedecode.com\/blog\/2015\/04\/les-formes-normales-bases-de-donnees\/#breadcrumb"},"inLanguage":"fr-FR","potentialAction":[{"@type":"ReadAction","target":["http:\/\/www.lafabriquedecode.com\/blog\/2015\/04\/les-formes-normales-bases-de-donnees\/"]}]},{"@type":"BreadcrumbList","@id":"http:\/\/www.lafabriquedecode.com\/blog\/2015\/04\/les-formes-normales-bases-de-donnees\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"http:\/\/www.lafabriquedecode.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Les formes normales"}]},{"@type":"WebSite","@id":"http:\/\/www.lafabriquedecode.com\/blog\/#website","url":"http:\/\/www.lafabriquedecode.com\/blog\/","name":"La Fabrique de code - Tech blog","description":"PHP objet, MySQL, Design Patterns, OOP...et plus !","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"http:\/\/www.lafabriquedecode.com\/blog\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"fr-FR"},{"@type":"Person","@id":"http:\/\/www.lafabriquedecode.com\/blog\/#\/schema\/person\/83863c048b82fd9ccf6407bddd241162","name":"admin","image":{"@type":"ImageObject","inLanguage":"fr-FR","@id":"http:\/\/www.lafabriquedecode.com\/blog\/#\/schema\/person\/image\/","url":"http:\/\/0.gravatar.com\/avatar\/fc2e1de7c8a1871b50ff9c6a6f8682a2?s=96&d=retro&r=g","contentUrl":"http:\/\/0.gravatar.com\/avatar\/fc2e1de7c8a1871b50ff9c6a6f8682a2?s=96&d=retro&r=g","caption":"admin"},"url":"http:\/\/www.lafabriquedecode.com\/blog\/author\/admin\/"}]}},"_links":{"self":[{"href":"http:\/\/www.lafabriquedecode.com\/blog\/wp-json\/wp\/v2\/posts\/991"}],"collection":[{"href":"http:\/\/www.lafabriquedecode.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.lafabriquedecode.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.lafabriquedecode.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"http:\/\/www.lafabriquedecode.com\/blog\/wp-json\/wp\/v2\/comments?post=991"}],"version-history":[{"count":20,"href":"http:\/\/www.lafabriquedecode.com\/blog\/wp-json\/wp\/v2\/posts\/991\/revisions"}],"predecessor-version":[{"id":1022,"href":"http:\/\/www.lafabriquedecode.com\/blog\/wp-json\/wp\/v2\/posts\/991\/revisions\/1022"}],"wp:attachment":[{"href":"http:\/\/www.lafabriquedecode.com\/blog\/wp-json\/wp\/v2\/media?parent=991"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.lafabriquedecode.com\/blog\/wp-json\/wp\/v2\/categories?post=991"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.lafabriquedecode.com\/blog\/wp-json\/wp\/v2\/tags?post=991"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}