« INFO710 0708 » : différence entre les versions

De Wiki du LAMA (UMR 5127)
Aller à la navigation Aller à la recherche
 
(6 versions intermédiaires par le même utilisateur non affichées)
Ligne 64 : Ligne 64 :


Les buts d'un SGBD sont multiples :
Les buts d'un SGBD sont multiples :
* indépendance physique et logique
* ...
* interface "haut niveau"
* ...
* cacher la partie algorithmique
* ...
* administration centralisée
* maintenir la cohérence / éviter la redondance
* distribuer les données / utilisateurs
* enforcer une sécurité


Voici quelques exemples de SGBD importants :
Voici quelques exemples de SGBD importants :
* [http://www.postgresqlfr.org/ PostgreSQL], entièrement libre et gratuit,
* [http://www.postgresqlfr.org/ PostgreSQL], entièrement libre et gratuit,
* ...
* MySQL
* MSQL, Access (Microsoft)
* ...
* Oracle

* DB2
* Ingres
* Sybase


===Premiers exemples===
===Premiers exemples===
Ligne 182 : Ligne 189 :
==Le langage SQL, première partie==
==Le langage SQL, première partie==


===Quoi ?===

"SQL" = "structured query language"

Le langage a été normalisé plusieurs fois :
* 1986 : première norme, assez incomplète. Elle a été révisée en 1989.
* 1992 : deuxième norme, langage appelé "SQL2"
* 1999 : troisième norme, langage appelé "SQL3". C'est l'apparition des "triggers" ou des requêtes récursives...
* 2003 : début de liens avec XML
* 2006 : dernière norme, toujours en lien avec XML

'''Rq :''' tous les SGBD rajoutent quelques fonctionnalités n'apparaissant dans aucune norme SQL...


SQL, c'est à la fois
* un langage de définition de données (ex : <tt>CREATE</tt>...)
* un langage de manipulation de données (ex : <tt>INSERT</tt>...)
* un langage d'interrogation de données (ex : <tt>SELECT</tt>...)
* un langage de contrôle d'accès aux données (ex : <tT>GRANT</tt>...)


===Types et identificateurs===

identificateurs : <tt>[a-z][a-z0-9#$_]*</tt> (en fait, moins de 30 caractères)

Les types courants utilisables (pour les attributs) sont les suivants :
* <tt>smallint</tt>
* <tt>int</tt>
* <tt>bigint</tt> (ajout PostgreSQL)
* <tt>float</tt>
* <tt>bool</tt>
* <tt>bit(n)</tt>
* <tt>varbit(n)</tt>
* <tt>date</tt>
* <tt>time</tt>
* <tt>char(n)</tt>
* <tt>varchar(n)</tt>
* <tt>text</tt> (ajout PostgreSQL)

'''Rq :''' la valeur <tt>NULL</tt> est dans tous les types, c'est une manière de rendre certains attributs optionnels.


===Définitions des données===

"Tout est dans une table."

====Entités====

Une entité est représentée par une ''table'' (un "tableau") :
* les attributs sont les colonnes
* les éléments sont des lignes

Chaque attribut doit avoir un ''identificateur'' et un ''type'' (voir plus haut).

Chaque table a elle aussi un ''identificateur''.

Pour désigner un attribut dans une table particulière, on utilise "<tt>id_table.id_attribut</tt>". (En général, ce n'est pas nécessaire...)


Pour créer une table, il faut utiliser la commande
CREATE TABLE id_table (
att1 type1,
att2 type2,
...
attn typen ) ;

Chacun des attributs (colonnes) peut être suivi de certaines contraintes :
* <tt>NOT NULL</tt>
* <tt>UNIQUE</tt>
* <tt>PRIMARY KEY</tt> (implique les deux précédents, et n'est possible que sur un attribut)
* <tt>CHECK(cond)</tt>
ou de l'indication <tt>DEFAULT(valeur)</tt>

Une contrainte faisant référence à plusieures colonnes doit être mise à la fin de la définition : par exemple, si la clé primaire est composée de la date d'emprunt et du numéro d'exemplaire, on peut avoir
CREATE TABLE emprunt (
no_exemplaire varchar(15),
date_emprunt date,
delai smallint NOT NULL,
PRIMARY KEY (no_exemplaire,date_emprunt) );

On veut parfois relier un attribut (ou plusieurs) à un attribut dans une autre table : on parle alors de ''clé étrangère''. On declare une telle clé avec la syntaxe :
CREATE TABLE emprunt (
code_livre varchar(15) REFERENCE livre (code) ,
date_emprunt date,
delai smallint NOT NULL,
PRIMARY KEY (code_livre,date_emprunt) );
ou, si la clé etrangère comporte plusieurs attributs :
CREATE TABLE emprunt (
no_exemplaire varchar(15) ,
isbn varchar(20) ,
date_emprunt date,
delai smallint NOT NULL,
PRIMARY KEY (no_exemplaire, isbn, date_emprunt),
FOREIGN KEY (no_exemplaire,isbn) REFERENCE livre (exemplaire,isbn) );

Si on ne met pas de noms d'attributs après un <tt>REFERENCE</tt>, alors PostgreSQL utilise la clé primaire de la table extérieure.

'''Rq :''' pour pouvoir déclarer une clé étrangère, il faut que les attributs de la table extérieure aient la propriété <tt>UNIQUE</tt>. Souvent, on veut aussi qu'ils aient la propriété <tt>NOT NULL</tt>.


====Associations====

Il y a deux manières de traduire les associations en SQL :
* soit par une clé étrangère
* soit par une nouvelle table


;clé étrangère: une association de type "1:n" (càd "_,1:_,n") est traduite par une clé étrangère du coté de la table "1" : on rajoute un attribut à cette table, et elle fait référence à la clé primaire de la table "n".

'''Rq :'''
* si la table "1" est une table "1,1", alors il faut rajouter que la clé etrangère est "<tt>NOT NULL</tt>"
* si les deux tables sont de type "_,1", alors on peut supposer qu'au moins une des cardinalités est de type "0,1" (une association de type "1,1:1,1" peut être supprimée. On met la clé étrangère du coté opposé et on rajoute la propriété <tt>UNIQUE</tt>. (Si les deux cardinalités sont "0,1", on fait comme on veut.)
* si l'association a des attributs, on les met du coté de la clé étrangère.

;nouvelle table: on traduit une association de type "n:n" par une nouvelle table :
* sa clé primaire est composée des clés des deux tables correspondant aux entités concernées
* chacune de ces clé devient une clé étrangère

On fait la même chose si on a des relation n-aires...

===Manipulation des données===

INSERT INTO nom_table (att1, att2, ..., attn)
VALUES (val1, val2, ..., valn) ;
(On peut omettre les noms d'attributs : on rentre alors les valeurs dans l'ordre de la définition de la table.)

On peut remplacer <tt>VALUES</tt> par un <tt>SELECT</tt>...

UPDATE nom_table
SET att1 = exp1,
att2 = exp2,
...
WHERE cond ;
(On peut mettre des sous-requêtes dans les expressions.)

Le <tt>WHERE</tt> est facultatif.

DELETE FROM nom_table
WHERE cond ;
(Attention, ne pas oublier le <tt>WHERE</tt> si on ne veut pas tout supprimer...)


Pour supprimer une table il faut utiliser la commande
DROP nom_table ;


==Modèle théorique : modèle relationnel==
==Modèle théorique : modèle relationnel==
Ligne 187 : Ligne 338 :


==Formes normales==
==Formes normales==
===decomposition d'un schema===

===Test de decomposition sans perte d'informations===

===Decomposition sans perte de dependances===

===Formes normales===

====Forme normale de Boyce-Codd====


==== Troisieme forme normale====


==Le langage SQL, deuxième partie==
==Le langage SQL, deuxième partie==
Ligne 211 : Ligne 373 :


Seulement deux TP sont officiellement prévus : les 19 et 20 décembre ! Nous ferons en fait probablement trois TP qui remplaceront des séances de cours / TD. Je vous tiendrais au courant...
Seulement deux TP sont officiellement prévus : les 19 et 20 décembre ! Nous ferons en fait probablement trois TP qui remplaceront des séances de cours / TD. Je vous tiendrais au courant...

* cours 1 : parties 1 et 2
* cours 2 : partie 3




Ligne 216 : Ligne 381 :


* td1 [http://www.lama.univ-savoie.fr/~hyvernat/Enseignement/0708/info710/td1.pdf (pdf)]
* td1 [http://www.lama.univ-savoie.fr/~hyvernat/Enseignement/0708/info710/td1.pdf (pdf)]
* td2 : suite du td1, en rajoutant ce qu'on a vu dans la partie 3

Dernière version du 3 décembre 2007 à 13:09

Ce wiki est un complément de cours pour le cours "info-710 : compléments de bases de données" (année 2007/2008). J'encourage tous les étudiants à y participer en l'augmentant et le corrigeant au fur et à mesure de l'avancement du cours. Pour pouvoir modifier les pages, inscrivez-vous pour obtenir un login et mot de passe. (Please, utilisez votre vrai nom...)

Vous pouvez aller voir ce guide pour vous familiariser avec les wikis.


Exercice : si vous n'en avez pas, créez-vous un compte et essayez de modifier cette page (correction de fôtes d'aurtograffe, rajout de détails, mise en page, ...)

Vous pouvez aussi utiliser la page de discussion pour ... discuter.


Introduction

Présentation, qu'est-ce qu'une base de données

Voici une définition possible de base de données (Richard Grin) :

"une base de données est un ensemble structuré de données enregistrées dans un ordinateur et accessibles de façon sélective par plusieurs utilisateurs."

Donc, il s'agit d'un ensemble de données qui sont :

  • structurées : ça n'est pas mon bureau,
  • enregistrées dans un ordinateur : ça n'est pas la BU,
  • accessibles de façon sélective : ça n'est pas un fichier pdf,
  • par plusieurs utilisateurs : ça n'est pas un fichier dans un tableur.

On pourrait rajouter les choses suivantes :

  • modifiables par plusieurs utilisateurs en même temps (ça n'est donc pas un fichier tableur sur un système de fichiers partagé),
  • accessibles de manière fine (ça n'est pas un catalogue),
  • dont la gestion est possible (tous les utilisateurs ne peuvent pas forcement faire la même chose).


Exercice : cherchez des exemples pour souligner l'importance de chaque point.

Trouvez-vous d'autres aspects à rajouter ?


Historique

Un rapide survol des développements des BD :

  • préhistoire : avant même les ordinateur, le problème de stocker, gérer et utiliser de grandes quantités de données c'est posé. (recensement, bibliothèques, cadastre etc.)
  • années 60 : l'informatique devient accessible pour les entreprises. Deux modèles (modèle hiérarchique et modèle réseau) sont développés pour gérer des banques de données. Un problème est que l'utilisateur doit connaître les détails de l'implantation de ces systèmes pour pouvoir les utiliser.
  • au début des années 70 : E. F. Codd propose un nouveau modèle qui sera à la base de la plupart des SGBD suivants : le modèle relationnel. Ce modèle a l'avantage d'abstraire la couche informatique et permet donc l'étude théorique des problèmes liés à la représentation des données et leur utilisation.
  • 1976 : apparition du modèle "entités / relation" pour faciliter la conception de BD à un niveau plus élevé.
  • milieu des années 80 : le langage SQL (Structured Querry Language) devient un standard.
  • milieu des années 90 : développement de l'internet, demande croissante d'outils pour gérer des BD à distance.
  • fin des années 90 : développement de SGBD ouvert (MySQL, PostgreSQL).
  • actuel : de nouveau problèmes apparaissent à cause de la taille des BD existantes. Une gestion fine et des algorithmes très efficaces sont nécessaires pour pouvoir accéder à certain projets (génome, espace etc.)


Gestion d'une base de données

Le terme "base de données" ("BD" ou "BDD") est généralement réservé aux données, alors que la partie logicielle permettant l'utilisation d'une BDD est appelée "système de gestion de bases de données" (ou "SGBD" pour les intimes). La version anglaise est database management system ("DBMS").

Les buts d'un SGBD sont multiples :

  • indépendance physique et logique
  • interface "haut niveau"
  • cacher la partie algorithmique
  • administration centralisée
  • maintenir la cohérence / éviter la redondance
  • distribuer les données / utilisateurs
  • enforcer une sécurité

Voici quelques exemples de SGBD importants :

  • PostgreSQL, entièrement libre et gratuit,
  • MySQL
  • MSQL, Access (Microsoft)
  • Oracle
  • DB2
  • Ingres
  • Sybase

Premiers exemples

Exercice : donnez quelques exemples détaillés de BD. Quels types de recherches fines pourriez-vous effectuer sur de telle BD ? Quels problèmes peuvent se produire, et quelle solution envisagez-vous ?

Représentation graphique de la structure d'une BDD (modèle conceptuel des données)

Le but de cette représentation est de donner la structure de notre BD indépendemment d'un quelconque SGBD. Comme en programmation, il est important de réfléchir avant de commencer à coder, de peur de faire n'importe quoi...

Img-01.png

un (mauvais) exemple de morceau de BDD

Entités et attributs

Entités

Une entité est une catégorie d'objets de même nature : des étudiants, des livres, des maisons, des crayons etc. Pour chaque type d'objet que l'on veut stocker dans la BD, il faut un attribut correspondant.

Les entités sont représentées par un rectangle :

Img-02.png

L'entité cours

Attributs

Les attributs sont des propriétés "importantes" (pour l'utilisateur de la BD) d'une entité. Les attributs sont listés sous le nom de l'entité comme suit :

Img-03.png

Notions de clé

Chaque objet d'une entité doit pouvoir être désigné de manière unique à partir d'un ou de plusieurs de ces attributs :

  • un cours est désigné par son code (info-710) et son année,
  • un enseignant par son nom et prénom (??)
  • un étudiant par son numéro d'étudiant
  • ...

Un ensemble d'attributs qui permet de désigner un élément d'une entité est appelé un clé candidate. Si cette clé est minimale (on ne peut pas enlever d'attributs sans perdre la propriété d'être une clé), on parle de clé minimale.

Chaque entité doit posséder une clé principale, choisie par le concepteur. Le (ou les) attributs de cette clé sont soulignés :

Img-04.png

Le choix d'une clé peut avoir de graves conséquences sur les performances. Il est de manière générale souhaitable d'avoir des clés comportant un seul attribut de type entier.

Exercice : est-ce qu'une clé principale peut prendre plusieurs fois la même valeur ?

Pour chacune des entités considérées précédemment, donnez les clés candidates et choisissez une clé principale.

Associations

Une association permet de relier deux entités entre elles : elles sont représentées par des rectangles aux coins arrondis. Les entités concernées sont reliées à l'association par un trait plein.

Les associations peuvent avoir des attributs, mais ce n'est pas obligatoire. Par exemple, on pourrait avoir une entité sport d'attributs nom, horaire et lieu, et une association sans attributs appelée pratique entre les entités etudiant et sport.

Fichier:Img-05.png

C'est kiki rajoute un joli dessin ?

Note : les associations n'ont pas de clé.

Cardinalités

La dernière information sur un diagramme de BD est la cardinalité : on indique combien de membres d'une entité peuvent être reliés à un élément d'une autre. On indique le minimum et le maximum, séparés par une virgule. La lettre permet de préciser un nombre arbitraire. (Tous les apparaissant dans un diagramme sont indépendants...)

Par exemple, dans le premier diagramme de cette partie,

  • chaque étudiant assiste au moins à un cours ("1,n")
  • chaque cours est suivi par plusieurs étudiants, éventuellement aucun ("0,n")
  • ...

Les cardinalités les plus courantes sont "0,n", "1,n", "0,1" et "1,1".

Exercice : donnez des exemples pour chacune de ces cardinalités.

Associations non binaires

---à faire---

Le langage SQL, première partie

Quoi ?

"SQL" = "structured query language"

Le langage a été normalisé plusieurs fois :

  • 1986 : première norme, assez incomplète. Elle a été révisée en 1989.
  • 1992 : deuxième norme, langage appelé "SQL2"
  • 1999 : troisième norme, langage appelé "SQL3". C'est l'apparition des "triggers" ou des requêtes récursives...
  • 2003 : début de liens avec XML
  • 2006 : dernière norme, toujours en lien avec XML

Rq : tous les SGBD rajoutent quelques fonctionnalités n'apparaissant dans aucune norme SQL...


SQL, c'est à la fois

  • un langage de définition de données (ex : CREATE...)
  • un langage de manipulation de données (ex : INSERT...)
  • un langage d'interrogation de données (ex : SELECT...)
  • un langage de contrôle d'accès aux données (ex : GRANT...)


Types et identificateurs

identificateurs : [a-z][a-z0-9#$_]* (en fait, moins de 30 caractères)

Les types courants utilisables (pour les attributs) sont les suivants :

  • smallint
  • int
  • bigint (ajout PostgreSQL)
  • float
  • bool
  • bit(n)
  • varbit(n)
  • date
  • time
  • char(n)
  • varchar(n)
  • text (ajout PostgreSQL)

Rq : la valeur NULL est dans tous les types, c'est une manière de rendre certains attributs optionnels.


Définitions des données

"Tout est dans une table."

Entités

Une entité est représentée par une table (un "tableau") :

  • les attributs sont les colonnes
  • les éléments sont des lignes

Chaque attribut doit avoir un identificateur et un type (voir plus haut).

Chaque table a elle aussi un identificateur.

Pour désigner un attribut dans une table particulière, on utilise "id_table.id_attribut". (En général, ce n'est pas nécessaire...)


Pour créer une table, il faut utiliser la commande

CREATE TABLE id_table (
 att1 type1,
 att2 type2,
 ...
 attn typen ) ;

Chacun des attributs (colonnes) peut être suivi de certaines contraintes :

  • NOT NULL
  • UNIQUE
  • PRIMARY KEY (implique les deux précédents, et n'est possible que sur un attribut)
  • CHECK(cond)

ou de l'indication DEFAULT(valeur)

Une contrainte faisant référence à plusieures colonnes doit être mise à la fin de la définition : par exemple, si la clé primaire est composée de la date d'emprunt et du numéro d'exemplaire, on peut avoir

CREATE TABLE emprunt (
 no_exemplaire varchar(15),
 date_emprunt date,
 delai smallint NOT NULL,
 PRIMARY KEY (no_exemplaire,date_emprunt) );

On veut parfois relier un attribut (ou plusieurs) à un attribut dans une autre table : on parle alors de clé étrangère. On declare une telle clé avec la syntaxe :

CREATE TABLE emprunt (
 code_livre varchar(15) REFERENCE livre (code) ,
 date_emprunt date,
 delai smallint NOT NULL,
 PRIMARY KEY (code_livre,date_emprunt) );

ou, si la clé etrangère comporte plusieurs attributs :

CREATE TABLE emprunt (
 no_exemplaire varchar(15) ,
 isbn varchar(20) ,
 date_emprunt date,
 delai smallint NOT NULL,
 PRIMARY KEY (no_exemplaire, isbn, date_emprunt),
 FOREIGN KEY (no_exemplaire,isbn) REFERENCE livre (exemplaire,isbn) );

Si on ne met pas de noms d'attributs après un REFERENCE, alors PostgreSQL utilise la clé primaire de la table extérieure.

Rq : pour pouvoir déclarer une clé étrangère, il faut que les attributs de la table extérieure aient la propriété UNIQUE. Souvent, on veut aussi qu'ils aient la propriété NOT NULL.


Associations

Il y a deux manières de traduire les associations en SQL :

  • soit par une clé étrangère
  • soit par une nouvelle table


clé étrangère
une association de type "1:n" (càd "_,1:_,n") est traduite par une clé étrangère du coté de la table "1" : on rajoute un attribut à cette table, et elle fait référence à la clé primaire de la table "n".

Rq :

  • si la table "1" est une table "1,1", alors il faut rajouter que la clé etrangère est "NOT NULL"
  • si les deux tables sont de type "_,1", alors on peut supposer qu'au moins une des cardinalités est de type "0,1" (une association de type "1,1:1,1" peut être supprimée. On met la clé étrangère du coté opposé et on rajoute la propriété UNIQUE. (Si les deux cardinalités sont "0,1", on fait comme on veut.)
  • si l'association a des attributs, on les met du coté de la clé étrangère.
nouvelle table
on traduit une association de type "n:n" par une nouvelle table :
  • sa clé primaire est composée des clés des deux tables correspondant aux entités concernées
  • chacune de ces clé devient une clé étrangère

On fait la même chose si on a des relation n-aires...

Manipulation des données

INSERT INTO nom_table (att1, att2, ..., attn)
 VALUES (val1, val2, ..., valn) ;

(On peut omettre les noms d'attributs : on rentre alors les valeurs dans l'ordre de la définition de la table.)

On peut remplacer VALUES par un SELECT...

UPDATE nom_table
 SET att1 = exp1,
     att2 = exp2,
     ...
 WHERE cond ;

(On peut mettre des sous-requêtes dans les expressions.)

Le WHERE est facultatif.

DELETE FROM nom_table
 WHERE cond ;

(Attention, ne pas oublier le WHERE si on ne veut pas tout supprimer...)


Pour supprimer une table il faut utiliser la commande

DROP nom_table ;

Modèle théorique : modèle relationnel

Formes normales

decomposition d'un schema

Test de decomposition sans perte d'informations

Decomposition sans perte de dependances

Formes normales

Forme normale de Boyce-Codd

Troisieme forme normale

Le langage SQL, deuxième partie

¿Intégration avec d'autres outils?

Quelques références


Détails techniques sur le cours

Organisation des séances

Comme il n'y a qu'un seul groupe, le cours sera entièrement en mode cours / TD.

Seulement deux TP sont officiellement prévus : les 19 et 20 décembre ! Nous ferons en fait probablement trois TP qui remplaceront des séances de cours / TD. Je vous tiendrais au courant...

  • cours 1 : parties 1 et 2
  • cours 2 : partie 3


Les support de TD et TP

  • td1 (pdf)
  • td2 : suite du td1, en rajoutant ce qu'on a vu dans la partie 3