Outils pour utilisateurs

Outils du site


td_histoire_numerique:exercice_3

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentes Révision précédente
Prochaine révision
Révision précédente
td_histoire_numerique:exercice_3 [2015/09/26 11:13]
Francesco Beretta
td_histoire_numerique:exercice_3 [2016/01/04 22:04] (Version actuelle)
Francesco Beretta
Ligne 1: Ligne 1:
 +Revenir à la [[td_histoire_numerique:​accueil#​troisieme_exercice|page d'​accueil]].
 +
 +
 ====== Installation de la base de données pour l'​exercice ====== ====== Installation de la base de données pour l'​exercice ======
  
-  ​Télécharger le {{:​td_histoire_numerique:​td2015_20190926.zip|fichier}} qui contient ​la sauvegarde ​de la base de données +[[td_histoire_numerique:​Installation de la base de données|Instructions pour l'​installation de la base de données]] 
-  * Créer un dossier appelé BD_TD2015 ​et un sous-dossier appelé ​'sauvegardes+ 
-  * Déplacer ​le fichier téléchargé vers le dossier ​'sauvegardes' ​et le décompresser ​(dézipper+ 
-  * Démarrer ​le logiciel pgAdmin3 +\\ 
-    Pour les utilisateurs de Windows, il se trouve ​dans le dossier C:\Bitnami\wappstack-5.5.29-1\postgresql\bin et normalement ​on peut le lancer depuis le menu des applications + 
-    ​* ​Pour les utilisateurs de MacOS il faut le télécharger depuis ​[[http://​www.pgadmin.org/download/macosx.php|cette page]] en prenant ​la version qui correspond à votre système d'exploitationsi possible ​la plus récenteUne fois installé, il faut paramétrer ​la connexion [on fera l'exercice ​en classe]:  + 
-      Dans le menu Fichier ​> Ajouter ​un serveur + 
-      Nom du serveur ​'postgresql_9_4+====== Utilisation de la base de données ​ ====== 
-      Hôtelocalhost + 
-      * port TCP 5432 +===== Fonctionnement d'une application web ===== 
-      * base maintenancepostgres + 
-      ​* ​nom utilisateurpostgres +Les principes de fonctionnement d'une application web utilisant une base de données relationnelle pour stocker les informations sont présentés dans ces articles: 
-      Mot de passe: le votre et l'enregistrer +  ​[[https://​fr.wikipedia.org/​wiki/​Serveur_web|Serveur web]] 
-  * Pour tousà ce stade làune fois la connexion au serveur ouverte et le mot de passé ​'avalé', ​créer une nouvelle base de données appelée ​'TD2015'. Dans l'onglet Définition mettre ​'codage' à UTF8laisser ​le reste des paramètres par défaut.+  * [[https://​fr.wikipedia.org/​wiki/​Serveur_informatique|Serveur informatique]] 
 +  * [[https://​fr.wikipedia.org/​wiki/​Système_de_gestion_de_base_de_données|Système de gestion de base de données]] 
 + 
 +Cette image présente schématiquement les des outils que nous allons utiliser:​\\ 
 + 
 +{{:​td_histoire_numerique:​apache_mysql_articulation_annote_e.png?100|}} 
 + 
 +\\ 
 + 
 +===== Modélisation des données ===== 
 + 
 + 
 + 
 +==== Quelques notions de base ==== 
 + 
 + 
 +  * [[https://​fr.wikipedia.org/​wiki/​Modèle_entité-association|Modèle entité-association]] 
 +  * [[https://​fr.wikipedia.org/​wiki/​Merise_(informatique)|La méthode Merise]] 
 +  * [[http://​merise.developpez.com/​faq/?​page=MCD|Merise et modélisation de données]] 
 +  * [[https://​en.wikipedia.org/​wiki/​Entity–relationship_model|ERD – entity relationship diagramm]] 
 + 
 + 
 +==== Application de cette méthode aux informations historiques ==== 
 + 
 +Il y a différentes manières d'​aborder ​la question de la modélisation des données historiques. L'​approche présentée ici est issue de l'​expérience du projet [[http://​symogih.org|symogih.org]]. 
 + 
 +On trouvera une explication détaillée de la méthode dans [[https://​halshs.archives-ouvertes.fr/​halshs-00677658|cet article]] et dans **{{:​td_histoire_numerique:​mcd_article_modifie.pdf|ce document}} ** les modèles conceptuels qui seront présentés au cours. 
 + 
 +Le <​html><​span style="​color:​red;​font-weight:​bold;">​modèle conceptuel ​de la base de données ​générique</​span></​html>​ mis à disposition se trouve dans **{{:​td_histoire_numerique:​mcd_base_td_histoire_numerique.pdf|ce fichier}} **. Il faut le télécharger et le garder sous la main. 
 + 
 + 
 +\\ 
 +===== Production des données ===== 
 + 
 +Pour des exemples de production de données, voir les exercices 4 et 5. 
 +\\ 
 + 
 +===== Transformation des textes encodés en XML ===== 
 + 
 +  * Créer ​dans la base de données ​un objet de type "objet digital"​ qui correspond au texte qu'on est en train d'​encoder. 
 +  * Lui donner un nom et ajouter ​un descriptif du texte encodé. On peut aussi décrire l'état d'avancement du codage. 
 +  * Copier ​le texte encodé en entier et le coller dans le champs ​'texte' ​de l'​objet en question 
 +  * Sauvegarder 
 + 
 +  * Ouvrir une boîte de dialogue SQL 
 +  * Exécuter la requête suivante, qui utilise la fonction vues.transformation_xml([argument]) tout en mettant en argument de la fonction ​le numéro d'​identifiant de l'​objet digital qui contient le texte à transformer 
 + <​code html>​SELECT vues.transformation_xml(3)</​code>​ 
 +  * Si le texte a été encodé correctement (balises ouvertes et fermées, encodées selon les indications du wiki, etc.), le texte est réécrit en XML et copie dans le champs '​texte_xml'​ de la table objet. 
 +  Sinon, apparaît un message d'​erreur qui indique, dans les premières lignes du messagel'​élément qui pose problème et qu'il faudra corriger ​dans le texte encodé d'​origine. 
 +  * La suite du message contient la suite des erreurs provoquées par cette première erreurcelle-ci corrigée, tout rentre dans l'​ordre 
 +  * Si plusieurs erreurs se présentent,​ il faudra les corriger l'une après l'​autre jusqu'​à l'​obtention du message: "​Effectué"​. 
 + 
 +===== Requêtes SQL / XPath ===== 
 + 
 +Une fois les textes transformés en XML avec la fonction indiquée ci-dessous, ​on peut intérroger la base de données et extraire ​des informations. 
 + 
 +Pour ce faire, on utilise la langage SQL en le combinant avec le langage XPATH que PostgreSQL implémente également à condition que le champs sur lequel porte la requête soit de type '​XML'​. 
 + 
 + 
 +Pour apprendre la syntaxe des requêtes SQL, voir la manuel PostreSQL, chapitres 2 et 7. Pour apprendre celle du XPATH, un excellent {{:​td_histoire_numerique:​obpe6630_xpath4.pdf|tutoriel}} rédigé par Wieslaw Zielonka est [[http://​www.liafa.jussieu.fr/​~zielonka/​Enseignement/​BDAvances/​2013/XML/xpath4.pdf|disponible sur internet]] 
 + 
 + 
 +Pour exécuter les requêtes ci-dessous:​ 
 + 
 +   * ouvrir ​la base de données avec pgAdminIII, sélectionner le dossier rouge 'schémas'​ dans l'​arboréscencepuis ouvrir ​la boît de dialoque '​SQL':​ bouton loupe. 
 +   * copier ​la requête dans l'Editeur SQL 
 +   * exécuter la requête avec le bouton vert en forme de flèche 
 +   * le résultat s'​affichera dans le panneau de sortie en bas 
 + 
 + 
 +Pour exporter le résultat
 + 
 +  ​sous CSV = dans le menu 'Fichier' sélectionner '​Exporter...',​ choisir ​un nom de fichier et un emplacement (attention à mettre le suffixe .csv après le nom) 
 +  pour visualiser directement le résultat avec un navigateur, sélectionner dans le menu 'Fichier' ​la commande '​Rapport rapide',​ choisir de nouveau un fichier de sortie (tout en bas), ne rien toucher aux autres paramètres et appuyer sur OK 
 +  le résultat apparaîtra immédiatement dans votre navigateur web 
 + 
 +Un exemple de requête
 +<code sql> 
 +WITH tw1 AS 
 +
 +  SELECT UNNEST(xpath ('//​in',​texte_xml)) texte_xml 
 +  FROM objets.objet 
 +  WHERE pk_objet = 3 
 +
 +SELECT tw1.texte_xml,​ 
 +       ​(((xpath ('/​in/​@ana',​tw1.texte_xml))[1])::​text)::​integer cle_type_information,​ 
 +       t1.nom type_information,​ 
 +       ​((xpath('/​in/​dat/​@when',​tw1.texte_xml))[1])::text date, 
 +       ((xpath('/​in/​en/​@ref',​tw1.texte_xml))[1])::​text acteur, 
 +       t2.nom nom_acteur 
 +FROM tw1 
 +  JOIN vues.vm_objet_vue_de_base t1 ON t1.pk_objet = ( ( (xpath ('/​in/​@ana',​tw1.texte_xml))[1])::​text)::​integer 
 +  LEFT JOIN vues.vm_objet_vue_de_base t2 ON t2.pk_objet = ( ((xpath('/​in/​en/​@ref',​tw1.texte_xml))[1])::​text)::​integer 
 +</​code>​ 
 + 
 +Pour des exemples d'​application,​ voir les **[[td_histoire_numerique:accueil&#​quatrieme_exercice|exercices 4 et 5]]**. 
 + 
 +\\ 
 +====== Documentation ====== 
 + 
 + 
 + 
 +===== Code SQL ===== 
 + 
 +Dans cette section on trouvera ​le code des principales fonctions SQL/PLpgSQL utilisées dans la base de données. 
 + 
 +==== Fonction vues.transformation_xml(integer) ==== 
 + 
 +Cette fonction transforme le texte codé avec le système des accolades en un document XML. En argument de la fonction, il faut mettre l'​identifiant (la clé primaire) de la ligne dans laquelle se trouve le texte à transformer. Le texte à transformer est stocké dans le champs "​texte" ​et sera retranscrit et enregistré automatiquement par la fonction dans le champs "​texte_xml"​. 
 + 
 +En cas d'​incohérence du codage au niveau des accolades dans le texte de départ, un message d'​erreur est produit par le serveur PostgreSQL qui perment en régle général, en cherchant le texte en question, de retrouver les passages du texte de départ qui posent problème. 
 + 
 + 
 +<code sql> 
 +-- Function: vues.transformation_xml(integer) 
 + 
 +-- DROP FUNCTION vues.transformation_xml(integer);​ 
 + 
 +CREATE OR REPLACE FUNCTION vues.transformation_xml(integer) 
 +  RETURNS character varying AS 
 +$BODY$  
 +WITH tw0 AS  
 +
 +  -- transforme les entités XML 
 +  SELECT REPLACE(REPLACE(REPLACE(texte,'&','&​amp;'​),'<','&​lt;'​),'>','&​gt;'​) txt 
 +  FROM objets.objet 
 +  WHERE pk_objet = $1 
 +), 
 +tw1 AS 
 +
 +  -- transforme les accolades en chevrons 
 +  SELECT REPLACE(REPLACE(REPLACE(txt,'​{/','</'​),'​{','<'​),'​}','>'​) txt 
 +  FROM tw0 
 +), 
 +tw2 AS 
 +
 +  -- traite le cas de balises à deux caractères qui contiennent le type après l'id de l'​objet:​ ajoute ​l'attribut "​type"​ 
 +  ​SELECT REGEXP_REPLACE(txt,'​(<​\w{2})([\d\|]+)([a-z]{2})(_?​)([\d|\|]*)(>​)'​,'​\1\2\4\5 type="​\3"​\6'​,'​g'​) AS txt 
 +  FROM tw1 
 +), 
 +tw3 AS 
 +
 +  -- traite ​le cas de balises à deux caractères suivies d'un 0: élimine l'attribut "​ref"​ tout en gardant l'​attribut @type 
 +  SELECT REGEXP_REPLACE(txt,'​(<​\w{2})(0)(_?​)([\d|\|]*)([\s"​=\w]*)(>​)','​\1\3\4\5\6','​g'​) AS txt 
 +  FROM tw2 
 +), 
 +tw4 AS 
 +
 +  -- traite le cas de balises à deux caractères suivies ou non d'un id possédant un '_': ajoute ​l'attribut @ana 
 +  SELECT REGEXP_REPLACE(txt,​'(<​\w{2})([\d|\|]*)(_)([\d\|]*)([\s"​=\w]*)(>​)','​\1\2\5 ana="​\4"​\6','​g'​) AS txt 
 +  FROM tw3 
 +), 
 +tw5 AS 
 +
 +  -- traite le cas de balises ​à deux caractères suivies d'un id : ajoute l'​attribut @ref 
 +  SELECT REGEXP_REPLACE(txt,'​(<​\w{2})([\d\|]+)([\s"​=\w|]*)(>​)','​\1 ref="​\2"​ \3\4','​g'​) AS txt 
 +  FROM tw4 
 +), 
 +tw6 AS 
 +
 +  -- traite le cas de balises seg et eud possédant un '​_':​ ajoute l'​attribut @ana 
 +  SELECT REGEXP_REPLACE(txt,'​(<​)(seg|eud)(_)([\d|\|]*)(>​)','​\1\2 ana="​\4"​\5','​g'​) AS txt 
 +  FROM tw5 
 +), 
 +tw7 AS 
 +
 +  -- traite ​le cas des dates avec un paramètre d'​incertitude en ajoutant l'​attribut @cert 
 +  SELECT REGEXP_REPLACE(txt,'​(<​)(dat)([0-9]+)(r|p)(_?​)([a-z]{2})(>​)','​\1\2\3\5\6 cert="​\4"​\7','​g'​) AS txt 
 +  FROM tw6 
 +), 
 +tw8 AS 
 +
 +  -- traite le cas des dates avec un type en ajoutant l'​attribut @type 
 +  SELECT REGEXP_REPLACE(txt,'​(<​)(dat)([0-9]+)(_)([a-z]{2})','​\1\2\3 type="​\5"','​g'​) AS txt 
 +  FROM tw7 
 +), 
 +tw9 AS 
 +
 +  -- traite le cas des dates en ajoutant l'​attribut @when 
 +  SELECT REGEXP_REPLACE(txt,'​(<​)(dat)([0-9]+)','​\1\2 when="​\3"','​g'​) AS txt 
 +  FROM tw8 
 +
 + ​UPDATE objets.objet 
 +   SET texte_xml = (concat('<​root>',​REGEXP_REPLACE(txt,​ '​\|',​ ' ' , '​g'​),'</​root>'​))::​xml 
 +FROM tw9 
 +WHERE pk_objet = $1; 
 + 
 +SELECT '​Effectué'::​varchar AS resultat; 
 + 
 + 
 +$BODY$ 
 +  LANGUAGE sql VOLATILE 
 +  COST 100; 
 +ALTER FUNCTION vues.transformation_xml(integer) 
 +  OWNER TO postgres; 
 + 
 +</​code>​
td_histoire_numerique/exercice_3.1443258835.txt.gz · Dernière modification: 2015/09/26 11:13 par Francesco Beretta