Données BDD

Identification

Infoforall

23 - Les Bases de Données


Vous avez vu en 1er les fichiers CSV, nous allons voir aujourd'hui qu'on peut aussi stocker nos données dans une base de données.

Documents de cours : open document ou pdf

1 - Principe de la Base de Données

Actualité de 2020

Il est vraiment malheureux en 2020 de stocker des données sensibles dans un simple fichier CSV alors que depuis 1970 on sait faire mieux !

En fait, cela vient de l'outil utilisé !

La vérité ? Toujours via un autre titre lu dans la presse :

Gros titre : 16000 cas de covid non analysés à cause d'une 'erreur'

Nous allons voir aujourd'hui qu'il existe pourtant des systèmes datant de 1970 qui ont pour but d'éviter ceci justement. Les bases de données.

Elles sont utilisées partout : sur les sites Web en passant par les données des entreprises, et même l'historique de votre navigateur Web ! Ce n'est donc pas une nouveauté...

1.1 [RAPPEL de 1er]

A) Données structurées

Les données structurées peuvent être représentées ainsi de façon abstraite :

  • Chaque ligne est l'un des enregistrements / objets / n-uplets.
  • Si la première ligne contient les noms des attributs, on la nomme en-tête.
  • Chaque colonne comporte les valeurs associées à un même descripteur / attribut.
  • L'ensemble des informations ayant la même structure d'attributs se nomme une collection ou une table.
  • La case à l'intersection d'une ligne et d'une colonne se nomme un champ.
  • Le contenu d'une case se nomme sa valeur.
  • Collection / Table Attributs ou Descripteurs
    Pokemon n° Nom Type Points de vie
    Enregistrement d'indice 0 1 Bulbasaur Grass 318
    Enregistrement d'indice 1 2 Ivysaur Grass 405
    Enregistrement d'indice 2 3 Venusaur Grass 525
    Enregistrement d'indice 3 3 VenusaurMega Venusaur Grass 625
B) Fichier CSV

En 1er, vous avez vu qu'il était possible de stocker les données dans un fichier CSV situé dans une mémoire de masse, fichier qui a deux énormes avantages :

  1. C'est un simple fichier-texte
  2. num;name;type;hp\n
    1;Bulbasaur;Grass;318\n
    2;Ivysaur;Grass;405\n
    ...

  3. Modifiable avec un simple éditeur de texte mais également avec un tableur

Désavantage : stocké en mémoire de masse donc accès très long....

C) Passage en RAM via la programmation

Les données de ce fichier peuvent alors être placées en mémoire vive (RAM). Pour cela, il faut :

  • Implémenter chaque enregistrement dans un tuple ou un dictionnaire
  • (1, "Bulbasaur", "Grass", 318)

    {'num': 1, 'name': "Bulbasaur", 'type': "Grass", 'hp': 318}

  • Implémenter la table dans un tableau de tuple ou un tableau de dictionnaires.
  • [
        (1, "Bulbasaur", "Grass", 318),
        (2, "Ivysaur", "Grass", 405),
    ...
    ]

    [
        {'num': 1, 'name': "Bulbasaur", 'type': "Grass", 'hp': 318},
        {'num': 2, 'name': "Ivysaur", 'type': "Grass", 'hp': 405},
    ...
    ]

Désavantage : le coût linéaire de la recherche dans un tableau. Avec 400 millions de données, cela devient vite long.

1.2 Définition d'une base de données

Définition

Une base de données est un ensemble structuré stockant des données intègres qui peuvent être traitées par un système informatique pour en sortir des informations.

On peut

  • insérer de nouvelles données;
  • en récupérer certaines colonnes uniquement (on dit projeter);
  • les trier;
  • récupérer certaines lignes uniquement (on dit filtrer);
  • les assembler (on dit joindre).
Propriétés

Le stockage doit avoir les propriétés suivantes :

  1. Intégrité des données : vérification du typage, des valeurs possibles (ex n° de téléphone ou adresse mail, date de ,naissance...). Une valeur non compatible avec l'information normalement stockée ne pourra pas être enregistrée.
  2. Persistance des données : stockage permanent et immédiat des modifications
  3. Sécurisation des accès : droits (accès, modification, création, suppression) différents selon l'utilisateur.
  4. Efficacité de traitement des requêtes : la requête a bien été effectuée si le système le dit. Inutile de vérifier.
  5. Gestion des accès concurrents : système multi-utilisateurs, plusieurs personnes peuvent faire des modifications en même temps.
  6. Indépendance entre la représentation logique des données et l'implémentation physique : la manipulation de la base de données ne nécessite pas de savoir comment les données sont implémentées.
  7. Interface directe ou service API : l'utilisateur doit pouvoir manipuler facilement les données via une interface graphique ou via un langage de programmation (API Application Programming Interface)
Principe d'une BDD : Multiusers et interface
SGBD

Un système permettant de gérer tous ces aspects s'appelle un système de gestion de bases de données relationnelles (SGBD).

1.3 Les 7 propriétés sur les fichiers CSV ?

L'utilisation de fichiers CSV ne permet pas de garantir les points précédents :

  1. Intégrité des données : aucune vérification, n'importe qui avec un traitement de texte peut modifier les données et rentrer n'importe quoi.
  2. Persistance des données : si on modifie le fichier, les programmes qui l'utilisent ne seront pas au courant et travailleront sur une ancienne version des données.
  3. Sécurisation des accès : oui, sous Linux qui permet une gestion des droits. Mais il faut bien configurer le fichier et son répertoire.
  4. Efficacité de traitement des requêtes : tout dépend du programme du développeur qui doit faire tout le travail de vérification, ou pas...
  5. Gestion des accès concurrents : un seul accès en écriture par fichier texte.
  6. Indépendance entre la représentation logique des données et l'implémentation physique : le développeur doit utiliser le format CSV et donc savoir comment les données sont enregistrées en réalité.
  7. Interface directe ou service API : de base, pas d'API, à moins de la créer de toute pièce.

2 - Historique

1955 : les premiers disques durs permettent de stocker des données en grand nombre et de pouvoir y accéder en un temps acceptable.

1960 : les premières bases de données ont stocké les enregistrements dans des arborescences.
Les missions Apollo ont utilisé ce type de BDD. Apollo 11 est la mission du programme spatial américain au cours de laquelle l'homme a marché sur la Lune, le 21 juillet 1969

On peut maintenant trouvé le code source de la mission sur GithHub : https://github.com/chrislgarry/Apollo-11.

En voici une célèbre photo montrant la quantité de code, version papier. A gauche, Margaret Hamilton, responsable de l'équipe chargée du développement du logiciel embarqué.

https://fr.wikipedia.org/wiki/Fichier:Margaret_Hamilton_-_restoration.jpg
Margaret_Hamilton, Mission Apollo 11. Image dans le domaine public (source wikipedia)

Le terme database (base de données) n'est apparu qu'en 1964 pour désigner une collection d'informations partagées par différents utilisateurs d'un système d'informations (militaire à l'époque).

En 1965, Charles Bachman conçoit l'architecture Ansi/Sparc encore utilisée de nos jours pour les BDD. Il a reçu le prix Turing en 1973 (équivalent du prix Nobel en informatique) .

https://fr.wikipedia.org/wiki/Fichier:Margaret_Hamilton_-_restoration.jpg
Charles Bachman - Image tirée du site amturing.acm.org -

En 1970, Edgar F. Codd note dans sa thèse de mathématiques sur l'algèbre relationnelle qu'un ensemble d'enregistrements est comparable à une relation en mathématiques : tous les enregistrements ont les mêmes attributs et forment les éléments d'un ensemble. Il montre que les jointures("assemblages" de plusieurs tables) sont équivalents à des produits cartésiens. Cette thèse est à l'origine des bases de données relationnelles que vous allez découvrir aujourd'hui. Edgar F. Codd a reçu le prix Turing en 1981.

https://fr.wikipedia.org/wiki/Fichier:Margaret_Hamilton_-_restoration.jpg
Edgar F Codd - Image tirée du site wikipedia, en Fair Use (voir la page du lien)

Dans une base de données relationnelles, l'information est organisée de façon très précise dans des tableaux à deux dimensions appelés

  • des relations lorsqu'on reste dans l'abstraction ou
  • des tables lorsqu'on les implémente en machine.

1974 : son modèle théorique a inspiré IBM, qui développe le langage SEQUEL pour Structured English QUEry Language (SEQUEL) (« langage d'interrogation structuré en anglais »), renommé ensuite SQL car le nom SEQUEL avait déjà été déposé par une société d'aéronautique. SQL est le principal langage utilisé pour dialoguer avec les bases de données relationnelles.

En 1979, la société qui deviendra Oracle Corporation présenta la première version commercialement disponible de SQL. Rapidement, plusieurs autres sociétés proposent leurs versions de SQL.

En 1986, SQL est adopté comme recommandation par l'Institut de normalisation américaine (ANSI).

En 1987, SQL est adopté comme comme norme internationale par l'Organisation internationale de normalisation (ISO).

no-SQL

Devant l'augmentation énorme ces dernières années de la quantité d'informations récoltées, certaines entreprises ont dû passer à d'autres formes de base de données : les bases de données non-relationnelles, également nommées no-SQL.

Ces bases de données permettent plus facilement le stockage d'informations en quantité vraiment importante. Les données stockées sont moins structurées et prennent donc moins de place. Attention, ces "nouvelles" bases de données ne remplacent pas les précédentes : il s'agit juste d'un autre usage.

3 - Relation

Regardons maintenant plus précisément ce qui caractérise les relations et pourquoi on parle de base de données relationnelles.

Nous allons commencer par un cas très simple : la relation unique. Une seule table donc.

Voici un exemple de relation basée sur les vieux jeux vidéos.

id jeu description annee_sortie editeur support genre capture_ecran
1 Flight Simulator Simulation de pilotage d'avion avec des pixels gros comme des camions ! 1980 subLOGIC Apple 2 Simulateur Flight Simulator
2 DONKEY KONG Un méchant singe géant a capturé la fiancé de JumpMan (qui portera plus tard le nom de Mario). Guide JumpMan pour qu'il délivre sa dulcinée. 1981 Nintendo Arcade Plate-formes Donkey Kong
3 PITFALL! Pitfall Harry, un explorateur, ramasse des objets éparpillés dans la jungle. 1982 Activision Atari 2600 Plate-formes Donkey Kong
4 PITFALL! Pitfall Harry, un explorateur, ramasse des objets éparpillés dans la jungle. 1983 Activision Commodore 64 (C64) Plate-formes Donkey Kong
5 Boulder Dash Rockford, mineur téméraire, ramasse des diamants et tente de ne pas se faire écraser par les énormes pierres instables. 1983 First Star Software Commodore 64 (C64) Plate-formes Boulder Dash

01° L'ensemble des données ci-dessus représente une table. Quel nom va-t-on lui donner dans cette activité :

  1. Un champ
  2. Une relation
  3. Un p-uplet
  4. Un attribut

...CORRECTION...

  • Une relation
  • Regardons maintenant cette ligne (en rouge) :

    id jeu description annee_sortie editeur support genre visuel
    1 Flight Simulator Simulation de pilotage d'avion avec des pixels gros comme des camions ! 1980 subLOGIC Apple 2 Simulateur Flight Simulator
    2 DONKEY KONG Un méchant singe géant a capturé la fiancé de JumpMan (qui portera plus tard le nom de Mario). Guide JumpMan pour qu'il délivre sa dulcinée. 1981 Nintendo Arcade Plate-formes Donkey Kong
    3 PITFALL! Pitfall Harry, un explorateur, ramasse des objets éparpillés dans la jungle. 1982 Activision Atari 2600 Plate-formes Donkey Kong
    4 PITFALL! Pitfall Harry, un explorateur, ramasse des objets éparpillés dans la jungle. 1983 Activision Commodore 64 (C64) Plate-formes Donkey Kong
    5 Boulder Dash Rockford, mineur téméraire, ramasse des diamants et tente de ne pas se faire écraser par les énormes pierres instables. 1983 First Star Software Commodore 64 (C64) Plate-formes Boulder Dash

    02° Quel nom va-t-on donner à cette ligne dans cette activité :

    1. Un champ
    2. Une relation
    3. Un p-uplet
    4. Un attribut

    ...CORRECTION...

  • Un p-uplet
  • On pourrait dire aussi n-uplet ou enregistrement.

    03° Comment se nomme l'un des éléments situés dans l'en-tête de la relation ?

    1. Un champ
    2. Une relation
    3. Un p-uplet
    4. Un attribut

    ...CORRECTION...

    1. Un attribut
    2. On pourrait aussi dire descripteur ou propriété.

    Regardons maintenant cette case (en rouge) :

    id jeu description annee_sortie editeur support genre capture_ecran
    1 Flight Simulator Simulation de pilotage d'avion avec des pixels gros comme des camions ! 1980 subLOGIC Apple 2 Simulateur Flight Simulator
    2 DONKEY KONG Un méchant singe géant a capturé la fiancé de JumpMan (qui portera plus tard le nom de Mario). Guide JumpMan pour qu'il délivre sa dulcinée. 1981 Nintendo Arcade Plate-formes Donkey Kong
    3 PITFALL! Pitfall Harry, un explorateur, ramasse des objets éparpillés dans la jungle. 1982 Activision Atari 2600 Plate-formes Donkey Kong
    4 PITFALL! Pitfall Harry, un explorateur, ramasse des objets éparpillés dans la jungle. 1983 Activision Commodore 64 (C64) Plate-formes Donkey Kong
    5 Boulder Dash Rockford, mineur téméraire, ramasse des diamants et tente de ne pas se faire écraser par les énormes pierres instables. 1983 First Star Software Commodore 64 (C64) Plate-formes Boulder Dash

    04° Comment se nomme l'une case correspondant à l'intersection d'un p-uplet (enregistrement) et d'un attribut (descripteur) ?

    1. Un champ
    2. Une relation
    3. Un p-uplet
    4. Un attribut

    ...CORRECTION...

    1. Un champ
    2. Chaque case correspond en effet à un champ de réponse possible. C'est l'équivalent d'une cellule dans un traitement de texte.

    05° Quelle est la valeur associée à ce champ ?

    ...CORRECTION...

    La valeur est "PITFALL !". Visiblement l'attribut jeu désigne des informations stockées sous forme d'une chaîne de caractères.

    Voyons maintenant les premières différences entre des données stockées dans un fichier CSV ou dans une base de données relationnelles.

    3.1 - Contrainte d'intégrité de DOMAINE

    Attribut : nom + domaine

    Lors de la création de la relation, il faut fournir la liste des attributs qu'on désire.

    Chaque attribut est défini par deux choses au moins :

    • Le nom de l'attribut :
      • On utilisera plutôt le snake_case car certaines BDD ne sont pas sensibles à la casse.
    • Le domaine de l'attribut : l'ensemble des valeurs qui sont autorisées pour cet attribut. Ces domaines peuvent correspondre à :
      • des types de données classiques typiques des langages de programmation (integer, string)... ou
      • des types plus contraignants : une date, une heure, un email, un n° de téléphone... ou même
      • des valeurs appartenant à un ensemble précis, par exemple {"EX", "TB", "B", "P", "I", "A"} pour des appréciations

    On notera que la plupart des SGBD acceptent la gestion de valeurs par défaut.

    Nécessité de NULL

    Les données doivent être intègres : on ne doit jamais insérer de données fausses. Comment faire si on ne connaît pas un n° de téléphone par exemple ? Mettre 0.0.0.0.0 serait manifestement une fausse information.

    En SQL, la valeur NULL indique :

    • Soit l'ABSENCE D'INFORMATION (date de remise en vente d'un produit en rupture fournisseur pour le moment);
    • Soit qu'elle n'a aucun sens pour ce enregistrement (colonne plaque d'immatriculation pour une personne qui ne possède pas de véhicule par exemple).

    NULL peut être choisie comme valeur par défaut pour certains champs. Cela évite de tout remplir dès le départ.

    Contraintes d'intégrité de DOMAINE

    On impose des CONTRAINTES d'intégrité de DOMAINE qui empêchent d'enregistrer une donnée si elle n'a pas le type attendu : tout ce qui rentre dans le système est analysé AVANT insertion.

    Si l'utilisateur veut insérer quelque chose qui n'a pas la forme d'un e-mail, on va refuser l'enregistrement plutôt que de risquer d'insérer une donnée non intègre.

    3.2 Domaines disponibles

    Les domaines disponibles changent sensiblement d'un système à un autre (SQLite, Maria DB, Oracle DB...).

    SQLite permet d'utiliser facilement SQL sans installer un serveur dédié pour interagir avec la base de données. Dans SQLite, la base de données est en réalité implémentée dans un fichier-texte.

    Logo SQLite

    Cette bibliothèque SQLite (écrite en C) est entièrement dans le domaine public. Le module Python sqlite3 nous permettra d'interagir en Python avec notre base de données : Python fera appel à la bibliothèque SQLite.

    Voici ce qu'on trouve sur le site officiel de https://www.sqlite.org :

    1. TEXT pour tout ce qui est caractère.
    2. NUMERIC pour un nombre.
    3. INTEGER pour un nombre entier.
    4. REAL pour un flottant. Attention, il s'agit bien de flottant malgré le nom du type !
    5. BLOB pour le reste : par exemple les images. Cela veut dire qu'on place simplement des octets. C'est un blob, une masse informe d'informations.

    La plupart des autres BDD SQL incluent

    • le type CHAR qui permet de stocker des caractères en nombre limité. Exemple : CHAR(40) pour dire qu'il faut EXACTEMENT 40 caractères.
    • le type VARCHAR. Exemple : VARCHAR(40) pour dire qu'il faut AU MAXIMUM 40 caractères.
    • le type DATE qui stocke des dates avec un formatage choisi à la création : AAAA-MM-JJ ou JJ-MM-AAAA ou MM-JJ-AAAA à l'américaine.
    • le type DATETIME qui stocke une date dans un format incluant date et heure : AAAA-MM-JJ HH:MM:SS.

    La bonne nouvelle pour vous ? Aucun système de BDD précis n'est imposée dans le programme NSI. Aucune question ne peut donc être posée de façon précise sur les différents types. On restera donc dans les généralités, en imaginant par exemple un système SQL mimant les types Python.

    id jeu description annee_sortie editeur support genre capture_ecran
    INTEGER TEXT TEXT INTEGER TEXT TEXT TEXT BLOB
    3.3 Schéma relationnel : définition formelle d'une relation

    Relation

    Une relation est définie en fournissant son nom ainsi que la liste de ses attributs (nom et domaine).

    [Hors programme] IMPLEMENTATION : création de la table de la relation salarie en SQL (version SQLite)

    Exemple de création de table avec SQLITE pour créer la table des salariées d'une entreprise (juste pour info, aucune connaissance sur la création de tables pendant les épreuves de NSI) :

    1 2 3 4 5 6 7 8
    CREATE TABLE salarie ( id INTEGER, nom TEXT NOT NULL, age INTEGER NOT NULL, adresse TEXT, salaire REAL, PRIMARY KEY (id) );

    Nous verrons un peu plus loin ce que signifie PRIMARY KEY.

    NOT NULL est clair : la valeur doit absolument être renseignée pour créer l'enregistrement. On n'acceptera donc ni les entrées mal formulées, ni les entrées où cette information est manquante.

    ABSTRACTION : schéma relationnel de la relation salarie

    On décrit la relation en restant à un niveau abstrait et en se rapprochant finalement d'un prototype de fonction, par exemple :

    salarie(id:int, nom:text, age:int, adresse:text, salaire:int)

    Soulignement : on souligne la clé primaire d'une relation.

    Majuscule pour la relation : on trouve parfois une convention consistant à mettre une majuscule sur le nom de la relation. Un peu comme le nom des Classes dans la programmation objet.

    Salarie(id:int, nom:text, age:int, adresse:text, salaire:int)

    1er lettre de la table : on prefixe parfois les attributs par la première lettre de la table 

    Salarie(s_id:int, s_nom:text, s_age:int, s_adresse:text, salaire:int)

    CamelCase ? : comme le soulignement se marie assez mal avec les underscores du snake_case, on utilise souvent plutôt l'autre convention 

    Salarie(sId:int, sNom:text, sAge:int, sAdresse:text, salaire:int)

    Attention : niveau abstrait, donc il n'existe pas de vraies conventions.

    06° Déterminer les noms des attributs et leurs types dans la table des jeux qu'on nommera jeu.

    id jeu description annee_sortie editeur support genre capture_ecran
    1 Flight Simulator Simulation de pilotage d'avion avec des pixels gros comme des camions ! 1980 subLOGIC Apple 2 Simulateur Flight Simulator
    2 DONKEY KONG Un méchant singe géant a capturé la fiancé de JumpMan (qui portera plus tard le nom de Mario). Guide JumpMan pour qu'il délivre sa dulcinée. 1981 Nintendo Arcade Plate-formes Donkey Kong
    3 PITFALL! Pitfall Harry, un explorateur, ramasse des objets éparpillés dans la jungle. 1982 Activision Atari 2600 Plate-formes Donkey Kong
    4 PITFALL! Pitfall Harry, un explorateur, ramasse des objets éparpillés dans la jungle. 1983 Activision Commodore 64 (C64) Plate-formes Donkey Kong
    5 Boulder Dash Rockford, mineur téméraire, ramasse des diamants et tente de ne pas se faire écraser par les énormes pierres instables. 1983 First Star Software Commodore 64 (C64) Plate-formes Boulder Dash

    ...CORRECTION...

    07° Fournir le schéma relationnel de la relation pokemon qui permettrait de mettre les données du fichier CSV dans une BDD.

    En voici un extrait :

    1 2 3 4
    Number, Name, Type 1, Type 2, Total, HP, Attack, Defense, Sp. Atk, Sp. Def, Speed, Generation, Legendary 1, Bulbasaur, Grass, Poison, 318, 45, 49, 49, 65, 65, 45, 1, False 2, Ivysaur, Grass, Poison, 405, 60, 62, 63, 80, 80, 60, 1, False 3, Venusaur, Grass, Poison, 525, 80, 82, 83, 100, 100, 80, 1, False

    Pensez à faire attention au nommage : l'espace n'est pas autorisé dans un nom d'attributs. A vous de voir si vous préférez prendre le snake_case ou le camelCase.

    ...CORRECTION...

    3.4 - Contrainte d'UNICITE (liée à la valeur de clé primaire/primary key)

    RAPPEL : dans un ensemble mathématique, chaque entité ne peut apparaître qu'une unique fois.

    • {1, 2, 3, 8} peut être vu comme un ensemble.
    • (1, 3, 3, 8) ne peut pas être vu comme un ensemble car 3 apparaît deux fois.
    A - Relation vue comme un ensemble

    Pour définir un n-uplet (objet), il faut fournir les n informations liées à cet objet dans la relation.

    La relation peut être vue comme un ensemble de n-uplets : chaque n-uplet doit donc être différent des autres. Il ne doit pas y avoir deux n-uplets qui auraient exactement les mêmes valeurs partout.

    B - Clé primaire / Primary Key (pk)

    La clé primaire est un attribut permettant d’identifier et différencier un n-uplet parmi tous les n-uplets de la relation

    Il s'agit le plus souvent d'un attribut de type INTEGER et nommé id.

    • Chaque n-uplet doit avoir une valeur id renseignée (NULL est interdit). En SQL, cela veut dire qu'une clé primaire a automatiquement la propriété NOT NULL.
    • Sa valeur id doit être différente de tous les autres id présents dans la relation. En SQL, une clé primaire a donc automatiquement la propriété UNIQUE.

    La clé primaire peut-être

    1. un attribut (comme un numero_etudiant) ou
    2. l'association de plusieurs attributs (comme (numero_de_sécu, nom, prenom)).

    Exemple

    • salarie(id:int, nom:text, prenom:text, nationalite:text) est un schéma relationnel et nous avons deux enregistrements : :
    • (007, James, Bond, Anglais) pour l'agent secret nommé James Bond.
    • (008, James, Bond, Anglais) pour le plombier nommé James Bond.

    On voit que bien que nom et prenom ne permettent pas de différencier nos deux employés.

    Par contre, lorsqu'un même individu réel apparaît deux fois dans une même table avec deux id différents, on parle de doublon. Et ça, il faut tout faire pour l'éviter.

    C - Contrainte d'UNICITE (liée à la valeur de clé primaire)

    La contrainte d'UNICITE impose qu'on puisse toujours distinguer deux n-uplets d'une relation.

    Un SGBD refuse d'insérer un n-uplet si sa clé primaire est déjà celle d'une autre n-uplet.

    Dans le cadre d'un SGBD, on peut charger le SGBD de choisir automatiquement le nouvel id d'un n-uplet qu'on veut insérer. On peut alors lui fournir NULL comme valeur d'id, et il choisira lui-même une valeur qui n'existe pas encore.

    1 2 3 4 5 6 7 8
    CREATE TABLE salarie ( id INTEGER, nom TEXT NOT NULL, age INTEGER NOT NULL, adresse TEXT, salaire REAL, PRIMARY KEY (id AUTOINCREMENT) );
    D - Conventions

    On identifie les clés primaires

    • en les soulignant dans un schéma relationnel abtrait
    • en plaçant une clé dorée sur l'interface graphique phpMyAdmin
    • parfois en plaçant le nom de la relation en suffixe (ex id_livre)
    • parfois en plaçant pk en préfixe (ex pk_id_livre)
    Exemple du livre

    Que prendre comme clé primaire ?

    L'attribut titre ne suffit pas : deux livres peuvent porter le même nom.

    Le couple (titre, auteur) ne suffit pas nécessairement : certains livres ont plusieurs éditions.

    Par contre, si vous voulez faire un site Web donnant des critiques littéraires, sans tenir compte des éditions, (titre, auteur) suffit.

    Le triplet (titre, auteur, édition) peut parfois être suffisant.

    Si vous voulez faire un site Web donnant des critiques littéraires, cela suffit.

    Un système d'identification unique existe déjà : l'ISBN (International Standard Book Number).

    Dans un bibliothèque, l'ISBN ou le triplet (titre, auteur, édition) ne sont pas suffisants : il peut y avoir plusieurs exemples d'un même livre. Dans ce cas, il faut rajouter de quoi identifier un livre physique précisement.

    • Soit un quadruplet (titre, auteur, édition, exemplaire)
    • Soit un numéro unique id pour chaque livre physique présent.

    08° On veut créer une relation eleve qui permettra d'identifier les élèves d'un établissement scolaire.

    Fournir le schéma relationnel comportant au moins 5 attributs qui permettrait de gérer ces élèves à minima (identification certaine, classe...).

    Les élèves disposent-ils d'un système d'identification leur permettant de garantir la contrainte d'UNICITE (autre que l'identificateur automatique de la relation elle-même) ?

    08° On veut créer une relation eleve qui permettra d'identifier les élèves d'un établissement scolaire.

    Fournir le schéma relationnel comportant au moins 5 attributs et permettant de gérer ces élèves à minima (identification certaine, classe...).

    Les élèves disposent-ils d'un système d'identification leur permettant de garantir la contrainte d'UNICITE (autre que l'identificateur automatique de la relation elle-même) ?

    09° Les élèves disposent-ils d'un système d'identification universel leur permettant de garantir la contrainte d'UNICITE (autre que l'identificateur automatique de la relation elle-même) ?

    10° Le numéro de SECU ne permet pas vraiment de jouer le rôle de clé primaire. Pourquoi ? Avec quoi le composer pour créer une clé primaire ?

    4 - Clés étrangères

    Nous allons maintenant voir une autre raison à l'existence de la clé primaire.

    En plus d'un jeu et de la console qui faisait tourner ce jeu, on rajoute maintenant sur chaque ligne des informations sur la console elle-même (visualisables en rouge ci-dessous) : la date de sortie de la console, sa mémoire et la puissance du microprocesseur.

    On rajoute les infos sur la console en plus des infos sur le jeu lui-même

    On voit que les jeux 10 et 11 tournaient sur la même console. Les mêmes informations sont donc présentes plusieurs fois. Ce n'est pas être optimum.

    Pour limiter ce problème, la solution envisagée par les bases de données relationnelles est de créer deux relations (jeu et console) contenant au total les mêmes informations qu'avant et de relier ces 2 relations entre elles.

    Chaque table a sa propre clé primaire (voir les colonnes rouges) qu'on décide de nommmer id dans les deux cas.

    La clé étrangère permet de faire le lien entre la table jeu et la table console

    Nouveauté : c'est la colonne bleue de la relation jeu qui permet de relier les deux relations.

    L'attribut id_support est une clé étrangère. Chaque valeur de clé étrangère doit être :

    • soit une valeur valide de clé primaire de la table console;
    • soit NULL.

    Regardons maintenant comment utiliser cela :

    11° Quatre choses :

    1. Localiser le p-uplet de la relation jeu dont la clé primaire id vaut 10.
    2. Quelle est la valeur de la clé étrangère id_support pour ce p-uplet ?
    3. Que peut-on en tirer comme informations sur la console de ce jeu ?
    4. On présente ci-dessous le p-uplet virtuel obtenu en concaténant les attributs de la relation jeu et les attributs de la relation console . Dans l'en-tête, une formule expliquant comment on a fait la liaison entre les deux relations. Question : Comment pourrait-on décrire cette équation en français : mêmes valeurs de clés primaires ? mêmes valeurs de clés étrangères ? Une clé étrangère valant une clé primaire ?
    5. id jeu description sortie editeur fichier_image genre jeu_retro.id_support = console.id nom RAM date_sortie
      10 PITFALL! Pitfall Harry, un explorateur, ramasse des objets éparpillés dans la jungle. 1983 Activision Donkey Kong Plate-formes 3 C64 64 ko 1982-08-01

    ...CORRECTION...

    1. Localiser le p-uplet de la relation jeu_retro dont la clé primaire vaut 10.
    2. Il s'agit de l'avant dernière ligne, le PITFALL ! sorti en 1983.

    3. Quelle est la valeur du champ id_support de ce p-uplet ?
    4. On lit 3 dans le champ de l'atttribut id_support.

    5. Que peut-on en tirer comme informations sur la console de ce jeu ?
    6. En allant voir dans la relation console, on peut voir qu'il s'agit d'une version du jeu pour le C64, ordinateur personnel sorti en 1982 et disposant de 64 ko de mémoire.

    7. Comment pourrait-on décrire cette équation en français : mêmes valeurs de clés primaires ? mêmes valeurs de clés étrangères ? Une clé étrangère valant une clé primaire ?
    8. On voit bien qu'on a une égalité entre une clé étrangère et une clé primaire.

    12° L'avantage de réaliser cette jointure en place mémoire est évident si le nombre de jeux est bien plus grand que le nombre de consoles : nous n'aurions pas à recopier en mémoire de multiples fois les mêmes informations, il suffit de suivre la liaison entre clé étrangère vers clé primaire. Quel risque cela annule-t-il ?

    ...CORRECTION...

    Il n'existe plus qu'une unique source d'information pour chaque colonne. Cela évite les erreurs bêtes comme le fait qu'on indique une fois que sa RAM est de 64 ko et ailleurs 67 ko à cause d'une erreur de frappe.

    4.1 Contrainte de REFERENCE (liée à la valeur de la clé étrangère, foreign key)

    A - Liaison entre relations

    Le système de liaison entre les relations est donc basé sur :

    1. des attributs nommés clés primaires respectant la contrainte d'UNICITE : (UNIQUE et NOT NULL) en SQL, elles identifient un n-uplet avec certitude.
    2. des attributs nommés clés étrangères dont la valeur permet de faire la liaison vers un autre n-uplet dont on connait la valeur de clé primaire.
    B - Contrainte de REFERENCE

    La contrainte de REFERENCE impose que la valeur d'une clé étrangère :

    • soit NULL si on ne connait pas l'information;
    • soit correspond à une valeur de clé primaire d'un autre enregistrement.
    C - Conventions

    On identifie les clés étrangères :

    • en plaçant un caractère dièse # devant leur nom dans un schéma relationnel
    • parfois en plaçant le nom de la table visée en suffixe : id_console
    Exemple

    Dans l'exemple des consoles et des jeux retro, la clé étrangère id_support doit être affectée à NULL, 1, 2 ou 3.

    La clé étrangère permet de faire le lien entre la table jeu et la table console

    13° On fournit ci-dessous les schémas relationnels des relations jeu et console.

    Pour distinguer les attributs des deux relations, on utilise souvent la notation pointée de la POO relation.attribut.

    Par exemple : jeu.id désigne un attribut id présent dans la relation jeu.

    1 2 3 4 5 6 7 8 9 10
    jeu ( id:int, jeu:text, description:text; sortie:date, editeur:text, fichier_image:blob, genre:text, #id_support:int )
    1 2 3 4 5 6
    console ( id:int, nom:text, ram:text; sortie:date, )

    Question : Donner les noms des clés présentes dans les deux tables. Pour chacune, préciser son type primaire ou étrangère en justifiant votre choix.

    ...CORRECTION...

    jeu.id désigne une clé PRIMAIRE car l'attribut est souligné.

    jeu.id_support désigne une clé ETRANGERE car l'attribut est précédé d'un #.

    console.id désigne une clé PRIMAIRE car l'attribut est souligné.

    14° Les valeurs de l'attribut id de la relation jeu (la première "colonne" à gauche) doivent-elles être toutes différentes ? Quelle contrainte doit respecter cet attribut ?

    La clé étrangère permet de faire le lien  entre la table jeu et la table console

    ...CORRECTION...

    Oui : nous avions vu qu'il s'agit de la clé primaire de la relation.

    Elle doit respecter la contrainte d'intégrité d'UNICITE (UNIQUE et NOT NULL).

    15° Les valeurs de l'attribut id_support de la relation jeu (la dernière "colonne" de la table) doivent-elles être toutes différentes ? Quelle contrainte doit respecter cet attribut ?

    La clé étrangère permet de faire le lien  entre la table jeu et la table console

    ...CORRECTION...

    Non, on peut avoir plusieurs fois la même valeur : id_support est une clé étrangère, plusieurs jeux peuvent mener à la même console.

    La contrainte d'intégrité de REFERENCE impose par contre que toutes les valeurs correspondent à une vraie valeur de clé primaire présente dans l'autre table, ou soit NULL.

    Nous avons deux tables mais nous voudrions créer un affichage ressemblant à ceci pour notre site Web parlant de jeux vidéo retro de types plateformes : on veut filter uniquement les jeux de plateformes mais obtenir un seul "tableau".

    On rajoute les infos sur la console en plus des infos sur le jeu lui-même

    Le principe : faire une jointure.

    Qu'est-ce que cela veut dire ?

    4.2 Mécanisme de la jointure (interne)

    Principe du JOIN, nommé aussi INNER JOIN

    On veut projeter tous les attributs des deux relations en utilisant ce mécanisme :

    • Pour chaque n-uplet de jeu dont la clé étrangère n'est pas NULL :
    • Localise le n-uplet de console qui a la bonne valeur de clé primaire.
    • Concatène les deux p-uplets pour former un nouveau p-uplet.
    • Ajoute cette concaténation à la projection
    Exemple

    On obtient alors ceci :

    id jeu description sortie editeur genre fichier_image id_support id nom RAM date_sortie
    7 Flight Simulator Simulation de piotage d'avion avec des pixels gros comme des camions ! 1980 subLOGIC Simulateur Flight Simulator 1 1 Apple II 4 ko 1977-06-10
    9 PITFALL! Pitfall Harry, un explorateur, ramasse des objets éparpillés dans la jungle. 1982 Activision Plate-formes Donkey Kong 2 2 Atari 2600 4 ko 1977-10-14
    10 PITFALL! Pitfall Harry, un explorateur, ramasse des objets éparpillés dans la jungle. 1983 Activision Plate-formes Donkey Kong 3 3 C64 64 ko 1982-08-01
    11 Boulder Dash Rockford, mineur téméraire, ramasse des diamants et tente de ne pas se faire écraser par les énormes pierres instables. 1983 First Star Software Plate-formes Boulder Dash 3 3 C64 64 ko 1982-08-01
    n-uplets manquants

    Notez que dans une jointure interne, on décide de ne jamais inclure les n-uplets de jeu dont la clé étrangère est NULL (les jeux sans console) ou les n-uplets de console jamais référencés par une clé étrangère (les consoles qui n'ont pas de jeux !).

    Une jointure interne ne construit donc que les concaténations où il existe bien une liaison entre un jeu et une console.

    On perd donc ici Donkey Kong car sa clé étrangère vaut NULL.

    Par contre, chaque console est bien présente car toutes possèdent au moins un jeu.

    4.3 Clause JOIN table ON cle_primaire = cle_etrangere

    Principe

    On va écrire quelque chose qui voudra dire

    REALISE UNE JOINTURE entre un n-uplet de A et un n-uplet de B sous condition d'égalité entre la clé étrangère et la clé primaire.

    Exemple avec les relations jeu et console
    1 2 3
    SELECT * FROM jeu JOIN console ON jeu.id_support = console.id

    L'ordre dans lequel on fournit les clés n'a pas d'importance :

    1 2 3
    SELECT * FROM jeu JOIN console ON console.id = jeu.id_support

    De même, savoir par quelle table on commence n'a pas d'importance :

    1 2 3
    SELECT * FROM console JOIN jeu ON jeu.id_support = console.id
    Syntaxe SQL

    Pour formuler cela en SQL, il faut utiliser deux nouveaux mots-clés :

    1. FROM a
    2. JOIN b
    3. ON a.cle_1  = b.cle_2

    Notez bien que la syntaxe est totalement symétrique : il suffit d'identifier les deux tables et les deux clés qui permettent de faire la liaison.

    Requête plus complète

    On peut préciser ce qu'on veut projeter (quelles colonnes) ou filtrer (quelles lignes) avec la syntaxe classique :

    1 2 3 4
    SELECT jeu.jeu, console.nom FROM jeu JOIN console ON jeu.id_support = console.id WHERE jeu.genre = "Plateforme"

    16° Vous n'avez pas encore fait de SQL, mais, même si c'est possible en SQl d'écrire ceci, pourquoi est-il préférable d'éviter d'utiliser un même nom pour une table et l'un de attributs ?

    1 2 3 4
    SELECT jeu.jeu, console.nom FROM jeu JOIN console ON jeu.id_support = console.id WHERE jeu.genre = "Plateforme"

    ...CORRECTION...

    Tout simplement car c'est source de confusion.

    En python, on n'utilise pas non plus une variable locale portant le même nom que sa fonction par exemple.

    C'est d'ailleurs l'une des raisons qui peut justifier d'utiliser une Majuscule comment première lettre d'une table. La confusion disparaîtrait.

    Sauf si, on décide de passer un jour sur un système SQL ne gérant pas la casse...

    Bref : autant ne JAMAIS faire cela. Pas de nom identique, pas de problème.

    5 - Schéma relationnel

    Schéma relationnel d'une base de données

    Le schéma relationnel d'une base de données est l'ensemble des relations et des liaisons entre ces relations. Il s'agit donc de donner le schéma relationnel de toutes les relations contenues dans la base de données et de montrer les liaisons entre elles.

    On doit donc fournir :

    1. le nom de chaque relation
    2. la liste des attributs de chaque relation (nom et domaine)
    3. Indiquer clairement la clé primaire des relations (soulignement ou pk)
    4. Indiquer clairement les clés étrangères (# ou fk)

    Pour l'exemple précédent, il s'agit donc juste des deux choses déjà présentées :

    1 2 3 4 5 6 7 8 9 10
    jeu_retro ( id_jeu_retro:int, jeu:text, description:text; sortie:date, editeur:text, fichier_image:blob, genre:text, #id_support:int (clé étrangère vers la relation console) )
    1 2 3 4 5 6
    console ( id_console:int, nom:text, ram:text; sortie:date, )

    On peut également les représenter sous forme de schéma graphique :

    sr_graphique.png

    17° Créer le schéma relationnel d'une bibliothèque.

    On aura besoin des relations livre, client, location.

    Les attributs doivent permettrent d'inscrire quelqu'un, de lui permettre de louer des livres, de savoir s'il a payé sa cotisation et de savoir jusqu'à quand la cotisation est payé, de savoir s'il est en interdiction et jusqu'à quand aura lieu cette interdiction.

    6 - FAQ

    Rien pour l'instant

    Activité publiée le 10 01 2021
    Dernière modification : 10 01 2021
    Auteur : ows. h.