Recensement

[45 min]

Soit le fichier CSV suivant :

1
"departement";"nbhabitants"
2
"01 - Ain";529378
3
"02 - Aisne";552320
4
"03 - Allier";357110
5
"04 - Alpes-de-Haute-Provence";144809
6
"05 - Hautes-Alpes";126636
7
"06 - Alpes-Maritimes";1022710
8
"07 - Ardèche";294522
9
"08 - Ardennes";299166
10
"09 - Ariège";142834
11
"10 - Aube";301388

Question

Établir un modèle relationnel et un code SQL permettant d'accueillir le contenu de ce fichier (on nommera la table dpt1).

Solution

1
dpt1 (#numEtNom:string, population:integer)
1
CREATE TABLE dpt1 (
2
  numEtNom VARCHAR PRIMARY KEY,
3
  population INTEGER
4
) ;

Question

Implémenter ce modèle sous Postgres et importer le fichier CSV.

Solution

1
\copy dpt1 FROM dpt1.csv WITH DELIMITER AS ';' CSV HEADER

Question

En quelle forme normale est le modèle ? Normalisez le en 3NF (on nommera la table dpt2).

Solution

Le modèle n'est pas en 1NF, le premier champ n'est pas atomique.

1
dpt2 (#num:string(2), nom:string, population:string) WITH nom KEY
1
CREATE TABLE dpt2 (
2
  num VARCHAR(2) PRIMARY KEY,
3
  nom VARCHAR UNIQUE NOT NULL,
4
  population INTEGER
5
) ;

Question

Écrivez et exécuter la requête SQL permettant de migrer dpt1 dans dpt2.

Indice

1
INSERT INTO dpt2 (...)
2
SELECT ...
3
FROM dpt1 

Indice

Utiliser la fonction SUBSTR.

Indice

Si vous avez défini #num comme entier, vous aurez besoin de la fonction CAST(madonnée AS montype)

Solution

1
INSERT INTO dpt2 (num, nom, population)
2
SELECT SUBSTR(numEtNom,1,2), SUBSTR(numEtNom,6), population 
3
FROM dpt1 ;

Question

Écrivez le programme PHP permettant d'afficher le contenu de la table normalisée, tel que présenté ci-dessous.

Page HTML visualisée avec un navigateur Web