{"id":448,"date":"2024-03-30T12:52:29","date_gmt":"2024-03-30T12:52:29","guid":{"rendered":"https:\/\/devopsopen.com\/?p=448"},"modified":"2024-03-31T07:47:23","modified_gmt":"2024-03-31T07:47:23","slug":"bdd-postgresql","status":"publish","type":"post","link":"https:\/\/devopsopen.com\/index.php\/2024\/03\/30\/bdd-postgresql\/","title":{"rendered":"BDD PostgreSQL"},"content":{"rendered":"<h2>Base de donn\u00e9es<\/h2>\n<ul>\n<li>Un cluster PSG peut h\u00e9brger plusieurs bases de donn\u00e9es<\/li>\n<li>Une connexion est r\u00e9alis\u00e9e dans le contexte d'une seule base de donn\u00e9es<br \/>\n<h2>Sch\u00e9ma<\/h2>\n<\/li>\n<li>Une base peut contenir de 1 \u00e0 N sch\u00e9ma<\/li>\n<li>Un objet ne peut appartenir qu'\u00e0 un seul sch\u00e9ma<\/li>\n<li>Les objets de sch\u00e9mas diff\u00e9rents peuvent \u00eatre acc\u00e9d\u00e9s au sein d'une m\u00eame connexion<br \/>\n<img decoding=\"async\" src=\"https:\/\/devopsopen.com\/wp-content\/uploads\/2024\/03\/schema.png\" alt=\"\" \/><\/p>\n<h2>Cluster PostgreSQL<\/h2>\n<\/li>\n<li>L'organisation du stockage physique est g\u00e9r\u00e9e au niveau du cluster<\/li>\n<li>Le point de montage par d\u00e9faut est d\u00e9fini via la variable $PGDATA<br \/>\n<h2>Tablespace<\/h2>\n<\/li>\n<li>La notion de tablespace permetde r\u00e9partir les donn\u00e9es sur des points de montage distincts.<\/li>\n<li>Dans la majorit\u00e9 des cas, le tablespace par d\u00e9faut 'pg_default' suffit<br \/>\n<h2>Fichier<\/h2>\n<\/li>\n<li>Les donn\u00e9es des tables et index sont stock\u00e9es dans des fichiers s\u00e9par\u00e9s (au moins 1 fichier par objet)<br \/>\n<img decoding=\"async\" src=\"https:\/\/devopsopen.com\/wp-content\/uploads\/2024\/03\/filespg.png\" alt=\"\" \/><\/li>\n<\/ul>\n<h1>Les objets d'une base PostgreSQL<\/h1>\n<ul>\n<li>Sch\u00e9ma de donn\u00e9es (Table, Domaine, Type)<\/li>\n<li>Sch\u00e9ma externe (Vue, R\u00e8gle)<\/li>\n<li>Traitements (S\u00e9quenceur, D\u00e9clencheur, fonction)<\/li>\n<li>Optimisation (Index, Partition, Vue Mat\u00e9rialis\u00e9e)<\/li>\n<li>S\u00e9curit\u00e9 (Utilisateur, R\u00f4le, Politique)<\/li>\n<\/ul>\n<h1>Le catalogue Postgresql<\/h1>\n<ul>\n<li>Le catalogue est un sch\u00e9ma de tables et de vues qui recense l'ensemble des objets d'une base et leurs m\u00e9tadonn\u00e9es<\/li>\n<li>Organisation :<br \/>\nSystem Catalog =&gt; Tables et vues du catalogue sp\u00e9cifique Postgresql<br \/>\n(pg_class, pg_attribut, pg_constraint, pg_sequence, pg_views, pg_indexes)<br \/>\nInformation schema =&gt; Vues du catalogue normalis\u00e9<br \/>\n(standard SQL : tables, columns, table_constraints, sequences, views)<\/li>\n<\/ul>\n<h1>Processus de mod\u00e9lisation<\/h1>\n<p>Trois niveaux d'abstraction <\/p>\n<ul>\n<li>Mod\u00e8le Conceptuel<\/li>\n<li>Mod\u00e8le Logique<\/li>\n<li>Mod\u00e8le Physique<\/li>\n<\/ul>\n<h1>Mod\u00e8le Relationnel<\/h1>\n<p>Les composantes de ce mod\u00e8le :<\/p>\n<h2>Mod\u00e8le de repr\u00e9sentation des donn\u00e9es<\/h2>\n<p>Departement(num_dpt,lib_dpt)<br \/>\nRelation : Comme Departement<br \/>\nAttribut : num_dpt, lib_dpt<br \/>\nDomaine : numdpt integer[0;9999] et lib_dpt varchar(40)<\/p>\n<h2>Contraintes d'int\u00e9grit\u00e9<\/h2>\n<p>R\u00e8gles appliqu\u00e9es aux relations et ou attributs pour garantir la coherence des donn\u00e9es.<\/p>\n<ul>\n<li>\n<p>Domaine : Un attribut est associ\u00e9 \u00e0 un type et puise ses valeurs dans un domaine<\/p>\n<\/li>\n<li>\n<p>Cl\u00e9 primaire: Identifiant primaire d'une relation compos d'un ou de plusieurs attributs \u00e0 valeur non nulle.<\/p>\n<\/li>\n<li>\n<p>Cl\u00e9 unique : Identifiant secondaire d'une relation compos\u00e9 d'un ou de plusieurs attributs.<\/p>\n<\/li>\n<li>\n<p>Cl\u00e9 \u00e9trang\u00e8re : Contrainte de r\u00e9f\u00e9rence des attributs identifiants d'une relation par des attributs d'une autre relation.<\/p>\n<\/li>\n<li>\n<p>De gestion : Autre contraintes de coh\u00e9rence entre des attributs d'une m\u00eame relation.<\/p>\n<\/li>\n<\/ul>\n<h2>Formes normales<\/h2>\n<p>R\u00e8gles appliqu\u00e9es au mod\u00e8le de donn\u00e9es pour \u00e9liminer les redondances de donn\u00e9es en stockage et \u00e9viter les incoh\u00e9rences lors des mises \u00e0 jour.<\/p>\n<p>La relation R avec les attributs a,b,c,d o\u00f9 ab est l'identifiant et c et d les attributs R(a,b,c,d)<\/p>\n<ul>\n<li>1FN : La valeur des attributs est atomique et la relation doit avoir un identifiant =&gt; R(a,b,c,d) et pas R(a,b,c1,c2,d)<\/li>\n<li>2FN : 1FN + Un sous-ensemble des attributs de l'identifiant ne doit pas \u00eatre lui-m\u00eame identifiant d'autres attributs. =&gt; dans la relation R(a,b,c,d) il faut pas avoir b identifiant de c<\/li>\n<li>3FN : 2FN + Un attribut qui ne compose pas l'identifiant ne doit pas \u00eatre lui-m\u00eame identifiant d'autres attributs =&gt; dans la relation R(a,b,c,d) il faut pas avoir c identifiant de d.<\/li>\n<\/ul>\n<h2>Op\u00e9rateurs relationnels<\/h2>\n<p>L'alg\u00e8bre relationnelle d\u00e9finit les op\u00e9rations de base pour manipuler les relations, voici les principales op\u00e9rations :<br \/>\nProjection, Produit Cart\u00e9sien, Union, Restriction, Jointure, Diff\u00e9rence...<\/p>\n<h1>Les bases de donn\u00e9es relationnelles orient\u00e9es objet<\/h1>\n<p>Tr\u00e8s peu utilis\u00e9, en plus des propri\u00e9t\u00e9s des bases relationnelles, des exntesions sont ajout\u00e9es :<br \/>\nType et collection orient\u00e9s objet (tables), l'h\u00e9ritage entre tables, Type oriont\u00e9 document (XML, JSON)<\/p>\n<h1>Langage SQL et cat\u00e9gories d'ordres<\/h1>\n<ul>\n<li>DQL : Select<\/li>\n<li>DML : Insert, Update, Delete<\/li>\n<li>DDL : Create, Alter, Drop<\/li>\n<li>DCL : Grant, Revoke<\/li>\n<li>TCL: Set Transaction, commit, rollback et savepoint<\/li>\n<\/ul>\n<h1>Langage Proc\u00e9dural<\/h1>\n<p>Avantages : Interpr\u00e9t\u00e9, Int\u00e9gration avec le langage SQL et Portabilit\u00e9<br \/>\nLimites : Pas de norme commune, Adherence au SGBD (DB2:SQLPL, Oracle:PL\/SQL, PG:PL\/pgSQL)<\/p>\n<p>Traitements stock\u00e9s : <\/p>\n<ul>\n<li>Proc\u00e9dure : unit\u00e9 de traitement<\/li>\n<li>Fonction : unit\u00e9 de traitement<\/li>\n<li>Package : ensemble de proc\u00e9dure d'un domaine fonctionnel<\/li>\n<li>D\u00e9clencheur : unit\u00e9 de traitement bas\u00e9e sur une logique de d\u00e9clenchement \u00e9v\u00e9nementielle<\/li>\n<\/ul>\n<p>Sp\u00e9cificit\u00e9 des traitements stock\u00e9s dans Postgresql :<\/p>\n<ul>\n<li>Plusieurs langages peuvent \u00eatre utilis\u00e9s<\/li>\n<li>Une fonction est tout ou partie d'une transaction<\/li>\n<li>Seules les proc\u00e9dures peuvent invoquer les ordres de gestion des transactions<\/li>\n<\/ul>\n<h1>M\u00e9canisme Transactionnel<\/h1>\n<p>Une transaction est un ensemble de mise \u00e0 jour atomique (ACID). elle permet de garantir la coh\u00e9rence des donn\u00e9es par rapport aux \u00e9ventuelles d\u00e9faillances syst\u00e8mes, applicatives et humaines.<\/p>\n<h1>M\u00e9canisme de verrouillage<\/h1>\n<p>Le m\u00e9canisme de verrouillage permet de prot\u00e9ger les donn\u00e9es contre des tentatives de modifications concurrentes.<br \/>\nGranularit\u00e9 : Enregistrement, Page et Objet<\/p>\n<h1>Multi-Version Concurrency Control<\/h1>\n<p>Son impl\u00e9mentation est propre \u00e0 chaque SGBD<\/p>\n<ul>\n<li>MVCC g\u00e8re plusieurs versions d'une donn\u00e9e afin de garantir la logique transactionnelle tout en limitant au max les latences induites par les m\u00e9canismes de verrouillage.<\/li>\n<li>Il permet de rendre les op\u00e9rations de lectures non bloquantes<\/li>\n<\/ul>\n<h2>MVCC PostgreSQL<\/h2>\n<p><img decoding=\"async\" src=\"https:\/\/devopsopen.com\/wp-content\/uploads\/2024\/03\/verrou.png\" alt=\"\" \/><\/p>\n<ul>\n<li>Cr\u00e9ation d'une nouvelle version de la ligne de donn\u00e9es avec prise en compte des modifications<\/li>\n<li>La version pr\u00e9c\u00e9dente de l'enregistrement sert d'image avant pendant la dur\u00e9e de la transaction<\/li>\n<li>En cas de validation de la transaction, la version pr\u00e9c\u00e9dente est consid\u00e9r\u00e9e comme 'morte' et son espace sera lib\u00e9r\u00e9 \u00e0 la prochaine op\u00e9ration 'VACUUM'.<\/li>\n<\/ul>\n<h2>MVCC DB2<\/h2>\n<p>DB2 est diff\u00e9rent :<\/p>\n<ul>\n<li>Les lectures posent un verrou de lecture<\/li>\n<li>Les MAJ posent un verrou de mise \u00e0 jour<\/li>\n<li>les verrous de lecture et de MAJ sont incompatibles entre eux<\/li>\n<\/ul>\n<p>Si une donn\u00e9e est v\u00e9rouill\u00e9e en MAJ, DB2 ne proposera pas son image avant aux lecteurs, qui devront attendre la lev\u00e9e du verrou.<br \/>\nSi la lecture se fait en 'Uncommitted Read' alors DB2 pourra restituer une donn\u00e9e en cours de modification mais pas encore commit\u00e9e... et qui ne le sera peut \u00eatre jamais!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Base de donn\u00e9es Un cluster PSG peut h\u00e9brger plusieurs bases de donn\u00e9es Une connexion est r\u00e9alis\u00e9e dans le contexte d&#8217;une seule base de donn\u00e9es Sch\u00e9ma Une base peut contenir de 1 \u00e0 N sch\u00e9ma Un objet ne peut appartenir qu&#8217;\u00e0 un seul sch\u00e9ma Les objets de sch\u00e9mas diff\u00e9rents peuvent \u00eatre acc\u00e9d\u00e9s au sein d&#8217;une m\u00eame connexion Cluster PostgreSQL L&#8217;organisation du stockage physique est g\u00e9r\u00e9e au niveau du cluster Le point de montage par d\u00e9faut est d\u00e9fini via la variable $PGDATA Tablespace La notion de tablespace permetde r\u00e9partir les donn\u00e9es sur des points de montage distincts. Dans la majorit\u00e9 des cas,\u2026<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_uag_custom_page_level_css":""},"categories":[9],"tags":[20],"blocksy_meta":{"styles_descriptor":{"styles":{"desktop":"","tablet":"","mobile":""},"google_fonts":[],"version":5}},"uagb_featured_image_src":{"full":false,"thumbnail":false,"medium":false,"medium_large":false,"large":false,"1536x1536":false,"2048x2048":false},"uagb_author_info":{"display_name":"admin","author_link":"https:\/\/devopsopen.com\/index.php\/author\/admin_bak\/"},"uagb_comment_info":2837,"uagb_excerpt":"Base de donn\u00e9es Un cluster PSG peut h\u00e9brger plusieurs bases de donn\u00e9es Une connexion est r\u00e9alis\u00e9e dans le contexte d'une seule base de donn\u00e9es Sch\u00e9ma Une base peut contenir de 1 \u00e0 N sch\u00e9ma Un objet ne peut appartenir qu'\u00e0 un seul sch\u00e9ma Les objets de sch\u00e9mas diff\u00e9rents peuvent \u00eatre acc\u00e9d\u00e9s au sein d'une m\u00eame&hellip;","_links":{"self":[{"href":"https:\/\/devopsopen.com\/index.php\/wp-json\/wp\/v2\/posts\/448"}],"collection":[{"href":"https:\/\/devopsopen.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/devopsopen.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/devopsopen.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/devopsopen.com\/index.php\/wp-json\/wp\/v2\/comments?post=448"}],"version-history":[{"count":3,"href":"https:\/\/devopsopen.com\/index.php\/wp-json\/wp\/v2\/posts\/448\/revisions"}],"predecessor-version":[{"id":454,"href":"https:\/\/devopsopen.com\/index.php\/wp-json\/wp\/v2\/posts\/448\/revisions\/454"}],"wp:attachment":[{"href":"https:\/\/devopsopen.com\/index.php\/wp-json\/wp\/v2\/media?parent=448"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/devopsopen.com\/index.php\/wp-json\/wp\/v2\/categories?post=448"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/devopsopen.com\/index.php\/wp-json\/wp\/v2\/tags?post=448"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}