Types de base

Module S6

Dalibo SCOP

24.04

17 avril 2024

Sur ce document

Formation Module S6
Titre Types de base
Révision 24.04
PDF https://dali.bo/s6_pdf
EPUB https://dali.bo/s6_epub
HTML https://dali.bo/s6_html
Slides https://dali.bo/s6_slides

Licence Creative Commons CC-BY-NC-SA

Cette formation est sous licence CC-BY-NC-SA. Vous êtes libre de la redistribuer et/ou modifier aux conditions suivantes :

  • Paternité
  • Pas d’utilisation commerciale
  • Partage des conditions initiales à l’identique

Marques déposées

PostgreSQL® Postgres® et le logo Slonik sont des marques déposées par PostgreSQL Community Association of Canada.

Versions de PostgreSQL couvertes

Ce document ne couvre que les versions supportées de PostgreSQL au moment de sa rédaction, soit les versions 12 à 16.

Types de base

  • PostgreSQL offre un système de typage complet
    • types standards
    • types avancés propres à PostgreSQL

Préambule

  • SQL possède un typage fort
    • le type utilisé décrit la donnée manipulée
    • garantit l’intégrité des données
    • primordial au niveau fonctionnel
    • garantit les performances
  • Qu’est-ce qu’un type ?
  • Les types SQL standards
    • numériques
    • temporels
    • textuels et binaires
  • Les types avancés de PostgreSQL

Objectifs

  • Comprendre le système de typage de PostgreSQL
  • Savoir choisir le type adapté à une donnée
  • Être capable d’utiliser les types avancés à bon escient

Les types de données

  • Qu’est-ce qu’un type ?
  • Représentation physique
  • Impacts sur l’intégrité
  • Impacts fonctionnels

Qu’est-ce qu’un type ?

  • Un type définit :
    • les valeurs que peut prendre une donnée
    • les opérateurs applicables à cette donnée

Impact sur les performances

  • Choisir le bon type pour :
    • optimiser les performances
    • optimiser le stockage

Impacts sur l’intégrité

  • Le bon type de données garantit l’intégrité des données :
    • la bonne représentation
    • le bon intervalle de valeur

Impacts fonctionnels

  • Un type de données offre des opérateurs spécifiques :
    • comparaison
    • manipulation
  • Exemple: une date est-elle comprise entre deux dates données ?

Types numériques

  • Entiers
  • Flottants
  • Précision fixée

Types numériques : entiers

  • 3 types entiers :
    • smallint : 2 octets
    • integer : 4 octets
    • bigint : 8 octets
  • Valeur exacte
  • Signé
  • Utilisation :
    • véritable entier
    • clé technique

Types numériques : flottants

  • 2 types flottants :
    • real/float4
    • double precision/float8
  • Données numériques « floues »
    • valeurs non exactes
  • Utilisation :
    • stockage des données issues de capteurs

Types numériques : numeric

  • 1 type
    • numeric(.., ..)
  • Type exact
    • mais calcul lent
  • Précision choisie : totale, partie décimale
  • Utilisation :
    • données financières
    • calculs exacts
  • Déconseillé pour :
    • clés primaires
    • données non exactes (ex : résultats de capteurs)

Opérations sur les numériques

  • Indexable : >, >=, =, <=,<
  • +, -, /, *, modulo (%), puissance (^)
  • Pour les entiers :
    • AND, OR, XOR (&, |, #)
    • décalage de bits (shifting): >>, <<
  • Attention aux conversions (casts) / promotions !

Choix d’un type numérique

  • integer ou biginteger :
    • identifiants (clés primaires et autre)
    • nombres entiers
  • numeric :
    • valeurs décimales exactes
    • performance non critique
  • float, real :
    • valeurs flottantes, non exactes
    • performance demandée : SUM(), AVG(), etc.

Types temporels

  • Date
  • Date & heure
    • …avec ou sans fuseau

Types temporels : date

  • date
    • représente une date, sans heure
    • affichage format ISO : YYYY-MM-DD
  • Utilisation :
    • stockage d’une date lorsque la composante heure n’est pas utilisée
  • Cas déconseillés :
    • stockage d’une date lorsque la composante heure est utilisée

Types temporels : time

  • time
    • représente une heure sans date
    • affichage format ISO HH24:MI:SS
  • Peu de cas d’utilisation
  • À éviter :
    • stockage d’une date et de la composante heure dans deux colonnes

Types temporels : timestamp

  • timestamp (without time zone !)
    • représente une date et une heure
    • fuseau horaire non précisé
  • Utilisation :
    • stockage d’une date et d’une heure

Types temporels : timestamp with time zone

  • timestamp with time zone = timestamptz
    • représente une date et une heure
    • fuseau horaire inclus
    • affichage : 2019-11-13 15:33:00.824096+01
  • Utilisation :
    • stockage d’une date et d’une heure, cadre mondial
    • à préférer à timestamp without time zone

Types temporels : interval

  • interval
    • représente une durée
  • Utilisation :
    • exprimer une durée
    • dans une requête, pour modifier une date/heure existante

Choix d’un type temporel

  • Préférer les types avec timezone
    • toujours plus simple à gérer au début qu’à la fin
  • Considérer les types range pour tout couple « début / fin »
  • Utiliser interval /generate_series

Types chaînes

  • Texte à longueur variable
  • Binaires

Types chaînes : caractères

  • varchar(_n_), text
  • Représentent une chaîne de caractères
  • Valident l’encodage
  • Valident la longueur maximale de la chaîne (contrainte !)
  • Utilisation :
    • stocker des chaînes de caractères non binaires

Types chaînes : binaires

  • bytea
  • Stockage de données binaires
    • encodage en hexadécimal ou séquence d’échappement
  • Utilisation :
    • stockage de courtes données binaires
  • Cas déconseillés :
    • stockage de fichiers binaires

Quel type choisir ?

  • varchar (sans limite) ou text (non standard)
  • Implémenter la limite avec une contrainte
    • plus simple à modifier
CREATE TABLE t1 (c1 varchar CHECK (length(c1) < 10))

Collation

  • L’ordre de tri dépend des langues & de conventions variables
  • Collation par colonne / index / requête
  • SELECT * FROM mots ORDER BY t COLLATE "C" ;
  • CREATE TABLE messages ( id int, fr TEXT COLLATE "fr_FR.utf8", de TEXT COLLATE "de_DE.utf8" );

Collation & sources

Source des collations :

  • le système : installations séparées nécessaires, différences entre OS
  • (>= v 10) : librairie externe ICU

CREATE COLLATION danois (provider = icu, locale = 'da-x-icu') ;

Types avancés

  • PostgreSQL propose des types plus avancés
  • De nombreuses extensions !
    • faiblement structurés (JSON…)
    • intervalle
    • géométriques
    • tableaux

Types faiblement structurés

  • PostgreSQL propose plusieurs types faiblement structurés :
    • hstore (clé/valeur historique)
    • json
    • xml

json

  • json
    • stockage sous forme d’une chaîne de caractère
    • valide un document JSON sans modification
  • jsonb (PG > 9.4)
    • stockage binaire optimisé
    • beaucoup plus de fonctions (dont jsonpath en v12)
    • à préférer

xml

  • xml
    • stocke un document XML
    • valide sa structure
  • Quelques opérateurs disponibles

Types intervalle de valeurs

  • Représentation d’intervalle
    • utilisable avec plusieurs types : entiers, dates, timestamps, etc.
    • contrainte d’exclusion

range

  • représente un intervalle de valeurs continues
    • entre deux bornes
    • incluses ou non
  • plusieurs types natifs
    • int4range, int8range, numrange
    • daterange, tsrange, tstzrange

Manipulation

  • opérateurs spécifiques *, &&, <@ ou @>
  • indexation avec GiST ou SP-GiST
  • types personnalisés

Contraintes d’exclusion

  • Utilisation :
    • éviter le chevauchement de deux intervalles (range)
  • Performance :
    • s’appuie sur un index
CREATE TABLE vendeurs (
  nickname varchar NOT NULL,
  plage_horaire timerange NOT NULL,
  EXCLUDE USING GIST (plage_horaire WITH &&)
);

Types géométriques

  • Plusieurs types natifs 2D :
    • point, ligne, segment, polygone, cercle
  • Utilisation :
    • stockage de géométries simples, sans référentiel de projection
  • Pour la géographie :
    • extension PostGIS

Types utilisateurs

  • Plusieurs types définissables par l’utilisateur
    • types composites
    • domaines
    • enums

Types composites

  • Regroupe plusieurs attributs
    • la création d’une table implique la création d’un type composite associé
  • Utilisation :
    • déclarer un tableau de données composites
    • en PL/pgSQL, déclarer une variable de type enregistrement

Type énumération

  • Ensemble fini de valeurs possibles
    • uniquement des chaînes de caractères
    • 63 caractères maximum
  • Équivalent des énumérations des autres langages
  • Utilisation :
    • listes courtes figées (statuts…)
    • évite des jointures