{"id":665,"date":"2013-07-13T17:56:14","date_gmt":"2013-07-13T15:56:14","guid":{"rendered":"http:\/\/www.lafabriquedecode.com\/blog\/?p=665"},"modified":"2013-07-13T17:56:14","modified_gmt":"2013-07-13T15:56:14","slug":"mysql-les-cles-etrangeres-et-lintegrite-referentielle","status":"publish","type":"post","link":"http:\/\/www.lafabriquedecode.com\/blog\/2013\/07\/mysql-les-cles-etrangeres-et-lintegrite-referentielle\/","title":{"rendered":"MySQL &#8211; les cl\u00e9s \u00e9trang\u00e8res et l&rsquo;int\u00e9grit\u00e9 r\u00e9f\u00e9rentielle"},"content":{"rendered":"<p>L&rsquo;heure est venue de nous pencher sur la notion de cl\u00e9 \u00e9trang\u00e8re dans une table. Les cl\u00e9s \u00e9trang\u00e8res servent \u00e0 \u00e9tablir des contraintes dites d&rsquo; \u00ab\u00a0int\u00e9grit\u00e9 r\u00e9f\u00e9rentielle\u00a0\u00bb.<br \/>\n<a href=\"http:\/\/www.lafabriquedecode.com\/blog\/wp-content\/uploads\/2013\/07\/192-246-thickbox1.jpg\"><img loading=\"lazy\" src=\"http:\/\/www.lafabriquedecode.com\/blog\/wp-content\/uploads\/2013\/07\/192-246-thickbox1.jpg\" alt=\"192-246-thickbox\" width=\"275\" height=\"226\" class=\"alignnone size-full wp-image-686\" \/><\/a><\/p>\n<h1>Qu&rsquo;est-ce qu&rsquo;une cl\u00e9 \u00e9trang\u00e8re ?<\/h1>\n<p>C&rsquo;est un champ (ou une colonne, ou un attribut, ou une propri\u00e9t\u00e9) d&rsquo;une table. Jusque l\u00e0, voil\u00e0 qui est plut\u00f4t rassurant !<\/p>\n<h1>Qu&rsquo;est-ce l&rsquo;int\u00e9grit\u00e9 r\u00e9f\u00e9rentielle ?<\/h1>\n<p>Dans cette expression, nous avons la notion centrale de \u00ab\u00a0r\u00e9f\u00e9rence\u00a0\u00bb. Il est en effet question d&rsquo;un champ qui fait <strong>r\u00e9f\u00e9rence<\/strong> \u00e0 un autre. Qu&rsquo;est-ce que cela signifie, dans les faits ? Et bien simplement que, si A est un champ qui <strong>r\u00e9f\u00e9rence<\/strong> B, alors A aura pour valeurs admissibles un sous-ensemble des valeurs de B.<\/p>\n<p>Plus concr\u00e8tement, si votre champ B, r\u00e9f\u00e9renc\u00e9 par A, a pour valeurs enti\u00e8res 1,2 et 3, alors A ne pourra avoir lui aussi que ces valeurs et pas 4 ou 0 !<\/p>\n<h1>Les cl\u00e9s \u00e9trang\u00e8res dans MySQL<\/h1>\n<p>En SQL, quelque soit le SGBDR cible, la notion de cl\u00e9 \u00e9trang\u00e8re s&rsquo;applique \u00e0 l&rsquo;aide du mot cl\u00e9 <em>FOREIGN KEY<\/em>. Comme vous vous appr\u00eatez \u00e0 modifier la structure de la table pour lui imposer cette contrainte, vous devrez utiliser <em>ALTER TABLE<\/em>.<\/p>\n<p>Nous allons voir la syntaxe en d\u00e9tail dans l&rsquo;exemple \u00e0 venir.<\/p>\n<h1>Un exemple, tout de suite !<\/h1>\n<p>Soit une table qui recense les joueurs d&rsquo;un sport quelconque (qui se joue \u00e0 deux):<\/p>\n<pre class=\"brush: sql; title: ; notranslate\" title=\"\">\r\ncreate table joueur (\r\nid smallint unsigned not null primary key,\r\nnom varchar(20),\r\nprenom varchar(20));\r\n<\/pre>\n<p>La table joueur poss\u00e8de un champ qui est son identifiant <em>primaire<\/em> : c&rsquo;est <strong>id<\/strong> ! Ce champ l\u00e0 poss\u00e8de un index parce que je l&rsquo;ai explicitement d\u00e9clar\u00e9 comme <strong>cl\u00e9 primaire<\/strong> de ma table (primary key). Voil\u00e0 pour ma table joueur, qui est somme toute tr\u00e8s simple.<\/p>\n<p>Nous allons maintenant cr\u00e9er une table qui va servir \u00e0 opposer un joueur \u00e0 un autre :<\/p>\n<pre class=\"brush: sql; title: ; notranslate\" title=\"\">\r\ncreate table matches (\r\nid smallint unsigned not null primary key,\r\nid_joueur1 smallint unsigned not null,\r\nid_joueur2 smallint unsigned not null,\r\nduree tinyint unsigned not null);\r\n<\/pre>\n<p>Cette table l\u00e0 poss\u00e8de elle aussi un identifiant (une cl\u00e9 primaire): en plus de cet identifiant, elle poss\u00e8de deux champs qui vont correspondre \u00e0 des identifiants de joueurs, donc \u00e0 des valeurs du champ id pr\u00e9sentes dans notre table joueur ! Dans l&rsquo;\u00e9tat rudimentaire de cette table il est tout \u00e0 fait possible de rentrer des joueurs, mais comment forcer l&rsquo;utilisateur de nos donn\u00e9es \u00e0 ne rentrer que des identifiants de joueurs qui existent ? C&rsquo;est l\u00e0 que la notion de <strong>cl\u00e9 \u00e9trang\u00e8re<\/strong> entre en jeu !<\/p>\n<p>Nous allons faire en sorte que les valeurs admissibles pour les champs <em>id_joueur1<\/em> et <em>id_joueur2<\/em> de la table <em>matches<\/em> soient uniquement celles pr\u00e9sentes dans le champ <em>id<\/em> de la table <em>joueur<\/em>, en clair : interdit de faire s&rsquo;affronter des joueurs qui n&rsquo;existent pas !<\/p>\n<p>Il va nous falloir modifier la structure de la table matches, il y a donc de l&rsquo;ALTER dans l&rsquo;air ! Notez qu&rsquo;il va falloir cr\u00e9er un index sur le champ r\u00e9f\u00e9ren\u00e7ant (celui qui va servir \u00e0 r\u00e9f\u00e9rencer l&rsquo;autre, qui est le r\u00e9f\u00e9renc\u00e9) : cet index est INDISPENSABLE car il \u00e9vite les <em>full table scans<\/em> et acc\u00e9l\u00e8re donc la v\u00e9rification des contraintes d&rsquo;int\u00e9grit\u00e9 r\u00e9f\u00e9rentielle !<\/p>\n<pre class=\"brush: sql; title: ; notranslate\" title=\"\">\r\nALTER TABLE matches ADD INDEX (id_joueur1); \r\nALTER TABLE matches ADD FOREIGN KEY (id_joueur1)\r\nREFERENCES joueur (id);\r\n<\/pre>\n<p>La voil\u00e0 enfin notre <em>r\u00e9f\u00e9rence<\/em> ! Nous disons en substance \u00ab\u00a0cr\u00e9e moi un lien entre le champ id de joueur et le champ id_joueur1 de matches\u00a0\u00bb ! Dor\u00e9navant, toute tentative d&rsquo;ins\u00e9rer un identifiant de joueur qui n&rsquo;existe pas se soldera par un \u00e9chec ! Faisons le de suite :<\/p>\n<pre>\r\nmysql> insert into matches (id_joueur1) values (1);\r\nERROR 1452 (23000): Cannot add or update a child row:\r\na foreign key constraint fails (`test`.`matches`, \r\nCONSTRAINT `matches_ibfk_1` FOREIGN KEY (`id_joueur1`) \r\nREFERENCES `joueur` (`id`))\r\n<\/pre>\n<p>Il n&rsquo;y a pas de joueur dans la table qui leur est r\u00e9serv\u00e9e, donc toute tentative de rentrer un num\u00e9ro de joueur dans id_joueur1 sera sanctionn\u00e9e par ce message d&rsquo;erreur !<\/p>\n<p>Pour que la m\u00eame <strong>contrainte<\/strong> p\u00e8se sur le champ <em>id_joueur2<\/em>, il faut effectuer exactement la m\u00eame op\u00e9ration que pr\u00e9c\u00e9demment, \u00e0 avoir : la pose d&rsquo;un index sur le champ ET la pose de la cl\u00e9 \u00e9trang\u00e8re :<\/p>\n<pre class=\"brush: sql; title: ; notranslate\" title=\"\">\r\nALTER TABLE matches ADD INDEX (id_joueur2); \r\nALTER TABLE matches ADD FOREIGN KEY (id_joueur)\r\nREFERENCES joueur (id);\r\n<\/pre>\n<p>Voil\u00e0 que maintenant p\u00e8se sur notre table matches deux contraintes d&rsquo;int\u00e9grit\u00e9 r\u00e9f\u00e9rentielle qui font qu&rsquo;il n&rsquo;est possible de faire s&rsquo;affronter que des joueurs r\u00e9pertori\u00e9s dans notre table joueur !<\/p>\n<h1>La fin d&rsquo;une id\u00e9e re\u00e7ue<\/h1>\n<p>Je me suis aper\u00e7u que beaucoup de gens \u00e9taient encore persuad\u00e9s qu&rsquo;une contrainte de cl\u00e9 \u00e9trang\u00e8re ne pouvait s&rsquo;appliquer qu&rsquo;entre un champ r\u00e9f\u00e9ren\u00e7ant et un champ r\u00e9f\u00e9r\u00e9nc\u00e9 <em>obligatoirement cl\u00e9 primaire de sa table<\/em>. C&rsquo;est absolument faux et ce m\u00eame si en pratique on s&rsquo;en sert le plus souvent comme \u00e7a ! Pour qu&rsquo;un champ puisse en r\u00e9f\u00e9rencer un autre, il suffit que tous les deux soient <em>index\u00e9s<\/em> et rien de plus. Comme la cl\u00e9 primaire est par d\u00e9finition un index, c&rsquo;est elle qui rend cette r\u00e9f\u00e9rence possible mais autrement, vous pouvez tout \u00e0 fait dans T1(<strong>A<\/strong>,B) faire que B r\u00e9f\u00e9rence D de T2(<strong>C<\/strong>,D) qui n&rsquo;est pas le moins du monde la cl\u00e9 primaire de T2 ! (les C.P sont en gras)<\/p>\n<h1>A retenir<\/h1>\n<ul>\n<li>Pour poser une cl\u00e9 \u00e9trang\u00e8re sur A qui r\u00e9f\u00e9rence B, il faut que A et B soient rigoureusement du m\u00eame type ! Attention quand vous utilisez des types num\u00e9riques, il faut que les signes (SIGNED\/UNSIGNED) soient identiques !<\/li>\n<li>Seul le moteur InnoDB autorise l&rsquo;utilisation de ce m\u00e9canisme !<\/li>\n<li>On remplit d&rsquo;abord les tables r\u00e9f\u00e9renc\u00e9es avant de remplir les r\u00e9f\u00e9ren\u00e7antes !<\/li>\n<li>On vide les tables r\u00e9f\u00e9ren\u00e7antes avant de vider les r\u00e9f\u00e9renc\u00e9es !<\/li>\n<li>Si vous souhaitez contourner momentan\u00e9ment la v\u00e9rification des contraintes d&rsquo;int\u00e9grit\u00e9, pour charger des donn\u00e9es en masse par exemple, utilisez <strong>SET FOREIGN_KEY_CHECKS = 0;<\/strong><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>L&rsquo;heure est venue de nous pencher sur la notion de cl\u00e9 \u00e9trang\u00e8re dans une table. Les cl\u00e9s \u00e9trang\u00e8res servent \u00e0 \u00e9tablir des contraintes dites d&rsquo; \u00ab\u00a0int\u00e9grit\u00e9 r\u00e9f\u00e9rentielle\u00a0\u00bb. Qu&rsquo;est-ce qu&rsquo;une cl\u00e9 \u00e9trang\u00e8re ? C&rsquo;est un champ (ou une colonne, ou un attribut, ou une propri\u00e9t\u00e9) d&rsquo;une table. Jusque l\u00e0, voil\u00e0 qui est plut\u00f4t rassurant ! Qu&rsquo;est-ce [&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":[2],"tags":[65,64,5],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v19.6.1 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>MySQL - les cl\u00e9s \u00e9trang\u00e8res et l&#039;int\u00e9grit\u00e9 r\u00e9f\u00e9rentielle - La Fabrique de code - Tech blog<\/title>\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\/2013\/07\/mysql-les-cles-etrangeres-et-lintegrite-referentielle\/\" \/>\n<meta property=\"og:locale\" content=\"fr_FR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"MySQL - les cl\u00e9s \u00e9trang\u00e8res et l&#039;int\u00e9grit\u00e9 r\u00e9f\u00e9rentielle - La Fabrique de code - Tech blog\" \/>\n<meta property=\"og:description\" content=\"L&rsquo;heure est venue de nous pencher sur la notion de cl\u00e9 \u00e9trang\u00e8re dans une table. Les cl\u00e9s \u00e9trang\u00e8res servent \u00e0 \u00e9tablir des contraintes dites d&rsquo; \u00ab\u00a0int\u00e9grit\u00e9 r\u00e9f\u00e9rentielle\u00a0\u00bb. Qu&rsquo;est-ce qu&rsquo;une cl\u00e9 \u00e9trang\u00e8re ? C&rsquo;est un champ (ou une colonne, ou un attribut, ou une propri\u00e9t\u00e9) d&rsquo;une table. Jusque l\u00e0, voil\u00e0 qui est plut\u00f4t rassurant ! Qu&rsquo;est-ce [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"http:\/\/www.lafabriquedecode.com\/blog\/2013\/07\/mysql-les-cles-etrangeres-et-lintegrite-referentielle\/\" \/>\n<meta property=\"og:site_name\" content=\"La Fabrique de code - Tech blog\" \/>\n<meta property=\"article:published_time\" content=\"2013-07-13T15:56:14+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/www.lafabriquedecode.com\/blog\/wp-content\/uploads\/2013\/07\/192-246-thickbox1.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=\"5 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"http:\/\/www.lafabriquedecode.com\/blog\/2013\/07\/mysql-les-cles-etrangeres-et-lintegrite-referentielle\/\",\"url\":\"http:\/\/www.lafabriquedecode.com\/blog\/2013\/07\/mysql-les-cles-etrangeres-et-lintegrite-referentielle\/\",\"name\":\"MySQL - les cl\u00e9s \u00e9trang\u00e8res et l'int\u00e9grit\u00e9 r\u00e9f\u00e9rentielle - La Fabrique de code - Tech blog\",\"isPartOf\":{\"@id\":\"http:\/\/www.lafabriquedecode.com\/blog\/#website\"},\"datePublished\":\"2013-07-13T15:56:14+00:00\",\"dateModified\":\"2013-07-13T15:56:14+00:00\",\"author\":{\"@id\":\"http:\/\/www.lafabriquedecode.com\/blog\/#\/schema\/person\/83863c048b82fd9ccf6407bddd241162\"},\"breadcrumb\":{\"@id\":\"http:\/\/www.lafabriquedecode.com\/blog\/2013\/07\/mysql-les-cles-etrangeres-et-lintegrite-referentielle\/#breadcrumb\"},\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"http:\/\/www.lafabriquedecode.com\/blog\/2013\/07\/mysql-les-cles-etrangeres-et-lintegrite-referentielle\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"http:\/\/www.lafabriquedecode.com\/blog\/2013\/07\/mysql-les-cles-etrangeres-et-lintegrite-referentielle\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"http:\/\/www.lafabriquedecode.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"MySQL &#8211; les cl\u00e9s \u00e9trang\u00e8res et l&rsquo;int\u00e9grit\u00e9 r\u00e9f\u00e9rentielle\"}]},{\"@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":"MySQL - les cl\u00e9s \u00e9trang\u00e8res et l'int\u00e9grit\u00e9 r\u00e9f\u00e9rentielle - La Fabrique de code - Tech blog","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\/2013\/07\/mysql-les-cles-etrangeres-et-lintegrite-referentielle\/","og_locale":"fr_FR","og_type":"article","og_title":"MySQL - les cl\u00e9s \u00e9trang\u00e8res et l'int\u00e9grit\u00e9 r\u00e9f\u00e9rentielle - La Fabrique de code - Tech blog","og_description":"L&rsquo;heure est venue de nous pencher sur la notion de cl\u00e9 \u00e9trang\u00e8re dans une table. Les cl\u00e9s \u00e9trang\u00e8res servent \u00e0 \u00e9tablir des contraintes dites d&rsquo; \u00ab\u00a0int\u00e9grit\u00e9 r\u00e9f\u00e9rentielle\u00a0\u00bb. Qu&rsquo;est-ce qu&rsquo;une cl\u00e9 \u00e9trang\u00e8re ? C&rsquo;est un champ (ou une colonne, ou un attribut, ou une propri\u00e9t\u00e9) d&rsquo;une table. Jusque l\u00e0, voil\u00e0 qui est plut\u00f4t rassurant ! Qu&rsquo;est-ce [&hellip;]","og_url":"http:\/\/www.lafabriquedecode.com\/blog\/2013\/07\/mysql-les-cles-etrangeres-et-lintegrite-referentielle\/","og_site_name":"La Fabrique de code - Tech blog","article_published_time":"2013-07-13T15:56:14+00:00","og_image":[{"url":"http:\/\/www.lafabriquedecode.com\/blog\/wp-content\/uploads\/2013\/07\/192-246-thickbox1.jpg"}],"author":"admin","twitter_card":"summary","twitter_creator":"@LaFabrique2Code","twitter_site":"@LaFabrique2Code","twitter_misc":{"\u00c9crit par":"admin","Dur\u00e9e de lecture estim\u00e9e":"5 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"http:\/\/www.lafabriquedecode.com\/blog\/2013\/07\/mysql-les-cles-etrangeres-et-lintegrite-referentielle\/","url":"http:\/\/www.lafabriquedecode.com\/blog\/2013\/07\/mysql-les-cles-etrangeres-et-lintegrite-referentielle\/","name":"MySQL - les cl\u00e9s \u00e9trang\u00e8res et l'int\u00e9grit\u00e9 r\u00e9f\u00e9rentielle - La Fabrique de code - Tech blog","isPartOf":{"@id":"http:\/\/www.lafabriquedecode.com\/blog\/#website"},"datePublished":"2013-07-13T15:56:14+00:00","dateModified":"2013-07-13T15:56:14+00:00","author":{"@id":"http:\/\/www.lafabriquedecode.com\/blog\/#\/schema\/person\/83863c048b82fd9ccf6407bddd241162"},"breadcrumb":{"@id":"http:\/\/www.lafabriquedecode.com\/blog\/2013\/07\/mysql-les-cles-etrangeres-et-lintegrite-referentielle\/#breadcrumb"},"inLanguage":"fr-FR","potentialAction":[{"@type":"ReadAction","target":["http:\/\/www.lafabriquedecode.com\/blog\/2013\/07\/mysql-les-cles-etrangeres-et-lintegrite-referentielle\/"]}]},{"@type":"BreadcrumbList","@id":"http:\/\/www.lafabriquedecode.com\/blog\/2013\/07\/mysql-les-cles-etrangeres-et-lintegrite-referentielle\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"http:\/\/www.lafabriquedecode.com\/blog\/"},{"@type":"ListItem","position":2,"name":"MySQL &#8211; les cl\u00e9s \u00e9trang\u00e8res et l&rsquo;int\u00e9grit\u00e9 r\u00e9f\u00e9rentielle"}]},{"@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\/665"}],"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=665"}],"version-history":[{"count":21,"href":"http:\/\/www.lafabriquedecode.com\/blog\/wp-json\/wp\/v2\/posts\/665\/revisions"}],"predecessor-version":[{"id":688,"href":"http:\/\/www.lafabriquedecode.com\/blog\/wp-json\/wp\/v2\/posts\/665\/revisions\/688"}],"wp:attachment":[{"href":"http:\/\/www.lafabriquedecode.com\/blog\/wp-json\/wp\/v2\/media?parent=665"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.lafabriquedecode.com\/blog\/wp-json\/wp\/v2\/categories?post=665"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.lafabriquedecode.com\/blog\/wp-json\/wp\/v2\/tags?post=665"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}