Master 2, Bases de données avancées, année 2022

Objectif

Une api simple géographique

  1. Aller sur ce site et essayer de comprendre le fonctionnement de l’API.

  2. Trouver grâce à l’API la ville la moins peuplé de la région Auvergne-Rhones-Alpes.

  3. Trouver grâce à l’API, la ville la plus peuplé dont le nom débute par “Mon”

  4. À l’aide du programme jq et de l’API, sauvegarder dans un document nord.json les informations pour toutes les villes du Nord et leur code postal.

Installer CouchDB

  1. Créez une nouvelle VM appelée couchdb. On notera dans la suite son ip $couchdb

  2. Installer couchdb dessus.

  3. Ajouter un administrateur supplémentaire cha avec comme mot de passe admin.

Le fichier de conf est situé dans /opt/couchdb/etc

  1. Vérifiez que l’installation s’est bien passé à l’aide de la commande
curl $couchdb:5984 | jq

Dans ce TP, jq sera très utile pour manipuler les très nombreux document JSON. Pour ceux qui le souhaitent, il est possible d’utiliser une interface graphique en visitant l’URL http://$couchdb:5984/_utils/

Je ne recommande pas particulièrement l’utilisation de cette interface, mais ça peut dépanner.

Manipulation simple

Pour interagir avec couchdb, il faut avoir en tête le protocole REST et utiliser essentiellement curl de manière approprié.

curl -u cha:admin -X PUT $couchdb:5984/ma_base

ou par exemple

curl -u cha:admin -X PUT $couchdb:5984/demo

Pour supprimer une base de données:

curl -u cha:admin -X DELETE $couchdb:5984/ma_base
curl -u cha:admin -X PUT --data '{"pain":["au", "chocolat"]}' $couchdb:5984/demo/chouquette

Vous devriez avoir en réponse un document du genre:

{
  "ok": true,
  "id": "chouquette",
  "rev": "3-58a35fe43992272808a5feccc5e9bab1"
}

La clef rev est nécessaire pour modifier, mettre à jour et supprimer le document.

Par exemple, pour le supprimer:

curl -u cha:admin -X DELETE  "$couchdb:5984/demo/chouquette?rev=3-58a35fe43992272808a5feccc5e9bab1"

Interaction programmatique

Dans le langage de votre choix (par défaut, Python):

  1. Écrire une classe permettant d’interagir en HTTP avec votre base de donnée.

La classe doit:

  1. difficile En lisant la documentation de CouchDB, ajouter des primitives pour insérer de nombreux documents en une fois efficacement.

Les batch insert consomment de la mémoire. Pour éviter les erreurs silencieuses, découper les insertions par paquet de 1000 documents maximums.

  1. En utilisant votre API, insérez les données de nord.json avec une ville par documents.

  2. (difficile) Insérez toutes les données de l’API en utilisant les méthodes d’insertions multiples.

:::{.remarque} Pour récupérer tout le dataset il suffit de faire:

curl "https://geo.api.gouv.fr/communes" > france.json

Recherche

En lisant la documentation,

Ajouter dans votre classe des méthodes pour faire des requêtes sur les documents. Votre API doit permettre d’écrire facilement toutes les requêtes faites dans la première partie.

  1. (difficile) Adapter votre code pour exposer des itérateurs qui respectent les mécanismes de pagination de CouchDB. En particulier, ils doivent éviter de télécharger la totalité des données en mémoire. Justifier l’intérêt de la pagination.

  2. Évaluer les performances de vos requêtes.

Indexes

Il est possible de créer des indexes sur certains champs des documents.

Pour ce faire, vous pouvez consulter la documentation et ajouter les indexes qui vous semblent nécessaire.

Évaluer la performance de vos requêtes avec les indexes.

Un middleware

Dans une nouvelle VM, Écrire un middleware qui expose une API similaire à celle de geo.api.gouv.fr.

Pour aller plus loin

Stockez dans la base de donnée PostgreSQL une table clef/valeur dont les valeurs sont de type JSONB. Ajouter un indexe GIN.

Écrire une API dans le langage de votre choix permettant la recherche dans PostgreSQL des mêmes informations que dans votre API pour CouchDB.

Comparer les performances de PostgreSQL à celles de CouchDB.


Mastodon