
{"id":14,"date":"2008-10-28T17:28:56","date_gmt":"2008-10-28T15:28:56","guid":{"rendered":"http:\/\/dasini.net\/blog\/?p=14"},"modified":"2008-11-29T16:37:13","modified_gmt":"2008-11-29T15:37:13","slug":"mysql-50-un-sgbdr-mature-part-24","status":"publish","type":"post","link":"https:\/\/dasini.net\/blog\/2008\/10\/28\/mysql-50-un-sgbdr-mature-part-24\/","title":{"rendered":"MySQL 5.0 : Un SGBDR mature ? &#8212; (part 2\/4)"},"content":{"rendered":"<p><!-- \t\t@page { margin: 2cm } \t\tP { margin-bottom: 0.21cm } \t\tH5 { margin-bottom: 0.21cm } \t\tH5.western { font-family: \"Arial\", sans-serif; font-size: 11pt } \t\tH5.cjk { font-family: \"MS Mincho\"; font-size: 11pt } \t\tH5.ctl { font-family: \"Tahoma\"; font-size: 11pt } \t\tH3 { margin-bottom: 0.21cm } \t\tH3.western { font-family: \"Arial\", sans-serif } \t\tH3.cjk { font-family: \"MS Mincho\" } \t\tH3.ctl { font-family: \"Tahoma\" } --><\/p>\n<address>(<a title=\"MySQL 5.O, un SGBDR mature ? -- (part 1\/4)\" href=\"http:\/\/dasini.net\/blog\/2008\/10\/27\/mysql-50-un-sgbdr-mature-part-14\/\">&lt;- pr\u00e9c\u00e9dent<\/a>)<\/address>\n<h3 class=\"western\">Vues<\/h3>\n<h5 class=\"western\">Des vues pour faciliter la visibilit\u00e9<\/h5>\n<p style=\"margin-bottom: 0cm;\">Les vues sont la plupart du temps utiles pour donner aux utilisateurs l\u2019acc\u00e8s \u00e0 un ensemble de relations repr\u00e9sent\u00e9es sous la forme d&rsquo;une table. Une vue est une table virtuelle\u00a0; les donn\u00e9es de la vue sont en fait des champs de diff\u00e9rentes tables regroup\u00e9es, ou des r\u00e9sultats d\u2019op\u00e9rations sur ces champs.<\/p>\n<p style=\"margin-bottom: 0cm;\">\n<h5 class=\"western\">Des vues pour am\u00e9liorer la confidentialit\u00e9<\/h5>\n<p style=\"margin-bottom: 0cm;\">Une vue n&rsquo;est pas forc\u00e9ment un regroupement de plusieurs tables mais peut \u00eatre un sous ensemble d&rsquo;une table (ou de plusieurs) ce qui permet de cacher des champs aux utilisateurs.<\/p>\n<p style=\"margin-bottom: 0cm;\">Par exemple il ne sera pas forc\u00e9ment utile \u00e0 tout le monde d&rsquo;acc\u00e9der aux champs indiquant les b\u00e9n\u00e9fices r\u00e9alis\u00e9s sur un projet dans votre base comptable. Vous pouvez donc cr\u00e9er une vue contenant tous les champs de la table projet sauf le champs b\u00e9n\u00e9fice.<\/p>\n<p style=\"margin-bottom: 0cm;\">L&rsquo;approche avec MySQL 5 sera donc plus souple car elle ne force plus un d\u00e9coupage de table pour g\u00e9rer la confidentialit\u00e9 et les droits donn\u00e9s aux utilisateurs. Les vues permettront de remplir ce r\u00f4le.<\/p>\n<h5 class=\"western\">Les vues compliquent les mises \u00e0 jour<\/h5>\n<p style=\"margin-bottom: 0cm;\">Ins\u00e9rer ou modifier des donn\u00e9es dans une vue n&rsquo;est pas aussi simple que de faire un update dans une table. Pour pouvoir le faire il faut r\u00e9fl\u00e9chir de fa\u00e7on plus pouss\u00e9e au mod\u00e8le conceptuel de donn\u00e9es :<\/p>\n<p style=\"margin-bottom: 0cm;\">Une vue n&rsquo;est pas forc\u00e9ment accessible en insertion \/ modification. Pour cela il faut qu&rsquo;il n&rsquo;y ait pas d&rsquo;incompatibilit\u00e9 logique \u00e0 ce qu&rsquo;elle le soit.<\/p>\n<ul>\n<li>\n<p style=\"margin-bottom: 0cm;\">Tous les champs des tables \tposs\u00e9dant des contraintes d&rsquo;int\u00e9grit\u00e9s (index unique, cl\u00e9s \tprimaires ..) doivent \u00eatre pr\u00e9sent<\/p>\n<\/li>\n<\/ul>\n<ul>\n<li>\n<p style=\"margin-bottom: 0cm;\">La vue ne doit pas  poss\u00e9der de \tregroupement ou d\u2019exclusion ( GROUP BY , DISTINCT,  UNION)<\/p>\n<\/li>\n<li>\n<p style=\"margin-bottom: 0cm;\">Le plan d&rsquo;ex\u00e9cution de la vue ne \tdoit pas passer par une table temporaire<\/p>\n<\/li>\n<\/ul>\n<p style=\"margin-bottom: 0cm;\"><!-- \t\t@page { margin: 2cm } \t\tP { margin-bottom: 0.21cm } \t\tH5 { margin-bottom: 0.21cm } \t\tH5.western { font-family: \"Arial\", sans-serif; font-size: 11pt } \t\tH5.cjk { font-family: \"MS Mincho\"; font-size: 11pt } \t\tH5.ctl { font-family: \"Tahoma\"; font-size: 11pt } --><\/p>\n<p class=\"western\" style=\"page-break-after: avoid;\">\n<h5 class=\"western\">Les vues de MySQL 5 par la pratique<\/h5>\n<pre style=\"margin-bottom: 0cm;\">CREATE\r\n[OR REPLACE]\r\nVIEW view-name\r\n[(column-list)]\r\nAS select-statement<\/pre>\n<p style=\"margin-bottom: 0cm;\">\n<p style=\"margin-bottom: 0cm;\">Cr\u00e9er une vue revient \u00e0 appliquer un filtre \u00e0 une ou plusieurs tables. Pour sch\u00e9matiser prenons une entreprise normale. Dans celle-ci il y a des employ\u00e9s regroup\u00e9s sous le terme &lsquo;personnel&rsquo;. On regroupe ces employ\u00e9s par &lsquo;cat\u00e9gorie&rsquo; en fonction de leur activit\u00e9 (administratif, informatique, commercial,&#8230;).<\/p>\n<p style=\"margin-bottom: 0cm;\">On peut cr\u00e9er une vue contenant l&rsquo;ensemble des informaticiens avec le code suivant :<\/p>\n<pre>CREATE VIEW personnelinformatique<\/pre>\n<pre>AS SELECT a.nom AS nom,a.prenom AS prenom,b.service AS service<\/pre>\n<pre>from categorie b, personnel a<\/pre>\n<pre>where a.fkCategorie = 1 and a.fkCategorie = b.pkCategorie;<\/pre>\n<p style=\"margin-bottom: 0cm;\">\n<p style=\"margin-bottom: 0cm;\"><!-- \t\t@page { margin: 2cm } \t\tP { margin-bottom: 0.21cm } \t\tH5 { margin-bottom: 0.21cm } \t\tH5.western { font-family: \"Arial\", sans-serif; font-size: 11pt } \t\tH5.cjk { font-family: \"MS Mincho\"; font-size: 11pt } \t\tH5.ctl { font-family: \"Tahoma\"; font-size: 11pt } --><\/p>\n<h5 class=\"western\">Optimisation des vues de MySQL 5<\/h5>\n<p style=\"margin-bottom: 0cm;\">\n<pre>CREATE<\/pre>\n<pre>[ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]<\/pre>\n<pre>[DEFINER = { user | CURRENT_USER }]<\/pre>\n<pre>[SQL SECURITY { DEFINER | INVOKER }]<\/pre>\n<pre>VIEW view-name<\/pre>\n<pre>[(column-list)]<\/pre>\n<pre>AS select-statement<\/pre>\n<pre>[WITH [CASCADED | LOCAL] CHECK OPTION]<\/pre>\n<p style=\"margin-bottom: 0cm;\">\n<p><!-- \t\t@page { margin: 2cm } \t\tP { margin-bottom: 0.21cm } --><\/p>\n<ul>\n<li>\n<p style=\"margin-bottom: 0cm;\">La clause facultative \u00abALGORITHM\u00bb \tn&rsquo;est pas standard. Elle permet d&rsquo;optimiser votre code.<\/p>\n<\/li>\n<li>\n<p style=\"margin-bottom: 0cm;\">MERGE utilise la requ\u00eate SQL \tayant servie \u00e0 la cr\u00e9ation de la vue comme base d&rsquo;op\u00e9ration.<\/p>\n<\/li>\n<li>\n<p style=\"margin-bottom: 0cm;\">TEMPTABLE utilise une table \ttemporaire cr\u00e9\u00e9e  pour stocker les r\u00e9sultats.<\/p>\n<\/li>\n<\/ul>\n<p style=\"margin-bottom: 0cm;\">Par d\u00e9faut l&rsquo;optimiseur MySQL d\u00e9cide lui-m\u00eame quelle option choisir (UNDEFINED). Pour am\u00e9liorer les performances, il est g\u00e9n\u00e9ralement plus int\u00e9ressant de le d\u00e9finir statiquement afin d&rsquo;\u00e9viter \u00e0 l&rsquo;optimiseur de le d\u00e9couvrir \u00e0 chaque ex\u00e9cution.<\/p>\n<p style=\"margin-bottom: 0cm;\">\u00abDEFINER\u00bb assigne un cr\u00e9ateur \u00e0 la vue.<\/p>\n<p style=\"margin-bottom: 0cm;\">\u00abSQL SECURITY\u00bb d\u00e9finit quelles seront les droits de l&rsquo;utilisateur, lors de l&rsquo;ex\u00e9cution de la vue. Deux valeurs sont possibles:<\/p>\n<p style=\"margin-bottom: 0cm;\">&#8211; DEFINER permet d&rsquo;ex\u00e9cuter la vue avec les droits du cr\u00e9ateur.<\/p>\n<p style=\"margin-bottom: 0cm;\">&#8211; INVOKER permet d&rsquo;ex\u00e9cuter la vue avec ses propres droits.<\/p>\n<p style=\"margin-bottom: 0cm;\">\n<p style=\"margin-bottom: 0cm;\">Pour finir, la clause facultative CHECK OPTION permet de ne modifier que la vue ou du moins des informations qui respectent les contraintes de la vue. Ainsi dans notre exemple, avec la clause CHECK OPTION, il ne sera pas possible de modifier au travers de la vue \u00ab\u00a0personnelInformatique\u00a0\u00bb une personne ne travaillant pas dans le service informatique.<\/p>\n<p style=\"margin-bottom: 0cm;\">Manque<\/p>\n<p style=\"margin-bottom: 0cm;\">Le seul l\u00e9ger b\u00e9mol est que la version 5.0 de MySQL ne disposera pas des vues mat\u00e9rialis\u00e9es. Les vues mat\u00e9rialis\u00e9es sont des donn\u00e9es physiquement dupliqu\u00e9es dans le SGDB. Par exemple le r\u00e9sultat d&rsquo;un calcul n&rsquo;est plus \u00e0 refaire pour chaque acc\u00e8s. Leur utilit\u00e9 se fait particuli\u00e8rement sentir lors de traitements de tables tr\u00e8s volumineuses .<\/p>\n<p style=\"margin-bottom: 0cm;\">\n<p style=\"margin-bottom: 0cm;\"><!-- \t\t@page { margin: 2cm } \t\tP { margin-bottom: 0.21cm } \t\tH5 { margin-bottom: 0.21cm } \t\tH5.western { font-family: \"Arial\", sans-serif; font-size: 11pt } \t\tH5.cjk { font-family: \"MS Mincho\"; font-size: 11pt } \t\tH5.ctl { font-family: \"Tahoma\"; font-size: 11pt } --><\/p>\n<h5 class=\"western\">Comparaison avec d&rsquo;autres SGBD<\/h5>\n<p><!-- \t\t@page { margin: 2cm } \t\tP { margin-bottom: 0.21cm } \t\tTD P { margin-bottom: 0.21cm } \t\tTH P { margin-bottom: 0.21cm; font-style: italic } --><\/p>\n<table border=\"1\" cellspacing=\"0\" cellpadding=\"4\" width=\"100%\" bordercolor=\"#000000\">\n<col width=\"67\"><\/col>\n<col width=\"46\"><\/col>\n<col width=\"47\"><\/col>\n<col width=\"49\"><\/col>\n<col width=\"47\"><\/col>\n<thead>\n<tr valign=\"top\">\n<th width=\"26%\"><\/th>\n<th width=\"18%\">MySQL<\/th>\n<th width=\"18%\">IBM DB2<\/th>\n<th width=\"19%\">Oracle<\/th>\n<th width=\"18%\">SQL Server<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr valign=\"top\">\n<td width=\"26%\">Basic<\/td>\n<td width=\"18%\">Oui<\/td>\n<td width=\"18%\">Oui<\/td>\n<td width=\"19%\">Oui<\/td>\n<td width=\"18%\">Oui<\/td>\n<\/tr>\n<tr valign=\"top\">\n<td width=\"26%\">UNION ALL<\/td>\n<td width=\"18%\">Oui<\/td>\n<td width=\"18%\">Oui<\/td>\n<td width=\"19%\">Oui<\/td>\n<td width=\"18%\">Oui<\/td>\n<\/tr>\n<tr valign=\"top\">\n<td width=\"26%\">JOINS<\/td>\n<td width=\"18%\">Oui<\/td>\n<td width=\"18%\">Oui<\/td>\n<td width=\"19%\">Oui<\/td>\n<td width=\"18%\">Oui<\/td>\n<\/tr>\n<tr valign=\"top\">\n<td width=\"26%\">INSTEAD OF<\/td>\n<td width=\"18%\">Non<\/td>\n<td width=\"18%\">Oui<\/td>\n<td width=\"19%\">Oui<\/td>\n<td width=\"18%\">Oui<\/td>\n<\/tr>\n<tr valign=\"top\">\n<td width=\"26%\">UPDATEABLE_KEY<\/td>\n<td width=\"18%\">Oui<\/td>\n<td width=\"18%\">Non<\/td>\n<td width=\"19%\">Non<\/td>\n<td width=\"18%\">Non<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Possibilit\u00e9 des vues avec MySQL 5.0<\/p>\n<p>UPDATEABLE_KEY est une fonctionnalit\u00e9 de MySQL permettant de modifier une clef primaire par le biais d&rsquo;une vue.<\/p>\n<address>(<a title=\"MySQL 5.O, un SGBDR mature ? -- (part 3\/4)\" href=\"http:\/\/dasini.net\/blog\/2008\/10\/29\/mysql-50-un-sgbdr-mature-part-34\/\">suite -&gt;<\/a>)<\/address>\n","protected":false},"excerpt":{"rendered":"<p>Les vues sont la plupart du temps utiles pour donner aux utilisateurs l\u2019acc\u00e8s \u00e0 un ensemble de relations repr\u00e9sent\u00e9es sous la forme d&rsquo;une table. Une vue est une table virtuelle ; les donn\u00e9es de la vue sont en fait des champs de diff\u00e9rentes tables regroup\u00e9es, ou des r\u00e9sultats d\u2019op\u00e9rations sur ces champs.<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"footnotes":""},"categories":[8],"tags":[241,12,14,13],"class_list":["post-14","post","type-post","status-publish","format-standard","hentry","category-mysql","tag-mysql","tag-mysql-5","tag-sgbd","tag-vues"],"aioseo_notices":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/p9LfWW-e","jetpack-related-posts":[{"id":192,"url":"https:\/\/dasini.net\/blog\/2008\/11\/23\/mysql-5-les-vues-part-17\/","url_meta":{"origin":14,"position":0},"title":"MySQL 5 : Les vues &#8212; (part 1\/7)","author":"Olivier DASINI","date":"23 novembre 2008","format":false,"excerpt":"Le langage SQL acronyme de Structured Query Language (Langage Structur\u00e9 de Requ\u00eates), a \u00e9t\u00e9 con\u00e7u pour g\u00e9rer les donn\u00e9es dans un SGBDR. A l'aide des DML (Data Manipulation Language ie les requ\u00eates SELECT, INSERT, UPDATE, DELETE) il est possible de manipuler ces donn\u00e9es qui sont stock\u00e9es dans des tables. SQL\u2026","rel":"","context":"Dans &quot;MySQL&quot;","block_context":{"text":"MySQL","link":"https:\/\/dasini.net\/blog\/category\/mysql\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":304,"url":"https:\/\/dasini.net\/blog\/2008\/12\/08\/mysql-5-les-vues-part-47\/","url_meta":{"origin":14,"position":1},"title":"MySQL 5 : Les vues &#8212; (part 4\/7)","author":"Olivier DASINI","date":"8 d\u00e9cembre 2008","format":false,"excerpt":"Voici quelques exemples pratiques tr\u00e8s simples pour illustrer les diff\u00e9rents besoins auxquels peuvent r\u00e9pondre les vues. On aura ici, une vue administrateur de base de donn\u00e9es. Les objets cr\u00e9\u00e9s ne seront pas utilis\u00e9s directement par les utilisateurs mais aux travers d'une application","rel":"","context":"Dans &quot;MySQL&quot;","block_context":{"text":"MySQL","link":"https:\/\/dasini.net\/blog\/category\/mysql\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":350,"url":"https:\/\/dasini.net\/blog\/2008\/12\/19\/mysql-5-les-vues-part-57\/","url_meta":{"origin":14,"position":2},"title":"MySQL 5 : Les vues &#8212; (part 5\/7)","author":"Olivier DASINI","date":"19 d\u00e9cembre 2008","format":false,"excerpt":"Masquer la complexit\u00e9 du sch\u00e9ma L'\u00e9quipe de d\u00e9veloppement doit \u00e9crire un moteur de recherche pour une application de commerce \u00e9lectronique. Voici un extrait des tables de la base de donn\u00e9es impliqu\u00e9es dans la recherche des produits du site.","rel":"","context":"Dans &quot;MySQL&quot;","block_context":{"text":"MySQL","link":"https:\/\/dasini.net\/blog\/category\/mysql\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":209,"url":"https:\/\/dasini.net\/blog\/2008\/11\/26\/mysql-5-les-vues-part-27\/","url_meta":{"origin":14,"position":3},"title":"MySQL 5 : Les vues &#8212; (part 2\/7)","author":"Olivier DASINI","date":"26 novembre 2008","format":false,"excerpt":"Syntaxe d'une vue CREATE VIEW La commande MySQL pour cr\u00e9er une vue est assez proche de la syntaxe du standard SQL. CREATE VIEW nom_de_la_vue AS requ\u00eate_select","rel":"","context":"Dans &quot;MySQL&quot;","block_context":{"text":"MySQL","link":"https:\/\/dasini.net\/blog\/category\/mysql\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":41,"url":"https:\/\/dasini.net\/blog\/2008\/10\/30\/mysql-50-un-sgbdr-mature-part-44\/","url_meta":{"origin":14,"position":4},"title":"MySQL 5.0 : Un SGBDR mature ? &#8212; (part 4\/4)","author":"Olivier DASINI","date":"30 octobre 2008","format":false,"excerpt":"Les d\u00e9clencheurs (triggers) sont des ordres de d\u00e9clenchement d'op\u00e9rations quand un \u00e9v\u00e8nement survient sur une table.","rel":"","context":"Dans &quot;MySQL&quot;","block_context":{"text":"MySQL","link":"https:\/\/dasini.net\/blog\/category\/mysql\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":403,"url":"https:\/\/dasini.net\/blog\/2009\/01\/13\/mysql-5-les-vues-part-77\/","url_meta":{"origin":14,"position":5},"title":"MySQL 5 : Les vues &#8212; (part 7\/7)","author":"Olivier DASINI","date":"13 janvier 2009","format":false,"excerpt":"Conserver la structure d'une table si elle doit \u00eatre modifi\u00e9e La probl\u00e9matique est de mettre \u00e0 jour le sch\u00e9ma de l'application en changeant la structure de certaines tables.","rel":"","context":"Dans &quot;MySQL&quot;","block_context":{"text":"MySQL","link":"https:\/\/dasini.net\/blog\/category\/mysql\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]}],"jetpack_likes_enabled":true,"_links":{"self":[{"href":"https:\/\/dasini.net\/blog\/wp-json\/wp\/v2\/posts\/14","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/dasini.net\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/dasini.net\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/dasini.net\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/dasini.net\/blog\/wp-json\/wp\/v2\/comments?post=14"}],"version-history":[{"count":17,"href":"https:\/\/dasini.net\/blog\/wp-json\/wp\/v2\/posts\/14\/revisions"}],"predecessor-version":[{"id":267,"href":"https:\/\/dasini.net\/blog\/wp-json\/wp\/v2\/posts\/14\/revisions\/267"}],"wp:attachment":[{"href":"https:\/\/dasini.net\/blog\/wp-json\/wp\/v2\/media?parent=14"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/dasini.net\/blog\/wp-json\/wp\/v2\/categories?post=14"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/dasini.net\/blog\/wp-json\/wp\/v2\/tags?post=14"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}