Systèmes de Gestion de Bases de Données (SGBD)
Introduction
Un Système de Gestion de Bases de Données (SGBD) est un logiciel qui permet de : - Créer et organiser des bases de données - Stocker, modifier et extraire des informations - Gérer les accès concurrents et la sécurité - Assurer l'intégrité et la cohérence des données
Fonctionnalités principales d'un SGBD
1. Gestion des données
- Stockage physique : Organisation des données sur les supports de stockage
- Indexation : Création d'index pour accélérer les recherches
- Compression : Optimisation de l'espace de stockage
2. Gestion des transactions
Une transaction est une séquence d'opérations qui doit être exécutée de manière atomique.
Propriétés ACID : - Atomicité : Tout ou rien (all or nothing) - Cohérence : Respect des contraintes d'intégrité - Isolation : Les transactions concurrentes n'interfèrent pas - Durabilité : Les modifications sont permanentes
# Exemple conceptuel de transaction
def transfert_argent(compte_source, compte_destination, montant):
# Début de transaction
try:
# Opération 1 : Débiter le compte source
debiter(compte_source, montant)
# Opération 2 : Créditer le compte destination
crediter(compte_destination, montant)
# Valider la transaction (COMMIT)
valider_transaction()
except Exception:
# Annuler la transaction (ROLLBACK)
annuler_transaction()
3. Gestion de la concurrence
Plusieurs utilisateurs peuvent accéder simultanément à la base de données :
- Verrous (Locks) : Empêchent les accès concurrents conflictuels
- Isolation des transactions : Différents niveaux d'isolation
- Détection des interblocages : Résolution des situations de blocage mutuel
4. Sécurité et contrôle d'accès
- Authentification : Vérification de l'identité des utilisateurs
- Autorisation : Gestion des droits d'accès (lecture, écriture, modification)
- Audit : Traçabilité des opérations
- Chiffrement : Protection des données sensibles
5. Sauvegarde et récupération
- Sauvegardes régulières : Copies de sécurité des données
- Journalisation : Enregistrement des modifications
- Récupération après panne : Restauration de l'état cohérent
Architecture d'un SGBD
Architecture à trois niveaux (ANSI/SPARC)
┌─────────────────────────────────────┐
│ Niveau externe │ ← Vues utilisateurs
│ (Schémas externes/Vues) │
├─────────────────────────────────────┤
│ Niveau conceptuel │ ← Schéma logique global
│ (Schéma conceptuel) │
├─────────────────────────────────────┤
│ Niveau interne │ ← Organisation physique
│ (Schéma interne) │
└─────────────────────────────────────┘
Niveau externe
- Vues utilisateurs : Chaque utilisateur voit une partie de la base
- Personnalisation : Adaptation aux besoins spécifiques
- Sécurité : Masquage des données sensibles
Niveau conceptuel
- Schéma global : Description complète de la structure logique
- Contraintes d'intégrité : Règles de cohérence
- Indépendance : Séparation de la logique et du physique
Niveau interne
- Organisation physique : Stockage sur disque
- Optimisation : Index, partitionnement, clustering
- Performance : Stratégies d'accès aux données
Types de SGBD
SGBD Relationnels (SGBDR)
Caractéristiques : - Basés sur le modèle relationnel - Utilisation du langage SQL - Respect des propriétés ACID
Exemples : - MySQL : Open source, très populaire pour le web - PostgreSQL : Open source, très complet et robuste - Oracle Database : Commercial, haute performance - SQL Server : Microsoft, intégration Windows - SQLite : Embarqué, fichier unique
SGBD NoSQL
Types principaux :
- Bases orientées documents (MongoDB, CouchDB)
- Bases clé-valeur (Redis, DynamoDB)
- Bases orientées colonnes (Cassandra, HBase)
- Bases orientées graphes (Neo4j, ArangoDB)
Exemple pratique : SQLite
SQLite est un SGBD embarqué parfait pour l'apprentissage :
import sqlite3
# Connexion à la base de données (création si inexistante)
connexion = sqlite3.connect('bibliotheque.db')
curseur = connexion.cursor()
# Création d'une table
curseur.execute('''
CREATE TABLE IF NOT EXISTS livres (
id INTEGER PRIMARY KEY AUTOINCREMENT,
titre TEXT NOT NULL,
auteur TEXT NOT NULL,
annee INTEGER,
disponible BOOLEAN DEFAULT 1
)
''')
# Insertion de données
livres_data = [
('1984', 'George Orwell', 1949),
('Le Petit Prince', 'Antoine de Saint-Exupéry', 1943),
('Dune', 'Frank Herbert', 1965)
]
curseur.executemany(
'INSERT INTO livres (titre, auteur, annee) VALUES (?, ?, ?)',
livres_data
)
# Validation des modifications
connexion.commit()
# Requête de sélection
curseur.execute('SELECT * FROM livres WHERE annee < 1950')
resultats = curseur.fetchall()
for livre in resultats:
print(f"ID: {livre[0]}, Titre: {livre[1]}, Auteur: {livre[2]}, Année: {livre[3]}")
# Fermeture de la connexion
connexion.close()
Optimisation des performances
Index
Les index accélérent les recherches :
-- Création d'un index sur la colonne 'auteur'
CREATE INDEX idx_auteur ON livres(auteur);
-- Index composé sur plusieurs colonnes
CREATE INDEX idx_auteur_annee ON livres(auteur, annee);
Requêtes optimisées
-- Éviter SELECT *
SELECT titre, auteur FROM livres WHERE annee > 1950;
-- Utiliser LIMIT pour limiter les résultats
SELECT titre FROM livres ORDER BY annee DESC LIMIT 10;
-- Utiliser des jointures efficaces
SELECT l.titre, e.date_emprunt
FROM livres l
INNER JOIN emprunts e ON l.id = e.livre_id
WHERE e.date_retour IS NULL;
Sécurité des SGBD
Injection SQL
Problème :
# DANGEREUX - Vulnérable aux injections SQL
nom_utilisateur = input("Nom d'utilisateur: ")
requete = f"SELECT * FROM utilisateurs WHERE nom = '{nom_utilisateur}'"
curseur.execute(requete)
Solution :
# SÉCURISÉ - Utilisation de paramètres
nom_utilisateur = input("Nom d'utilisateur: ")
requete = "SELECT * FROM utilisateurs WHERE nom = ?"
curseur.execute(requete, (nom_utilisateur,))
Gestion des droits
-- Création d'un utilisateur
CREATE USER 'lecteur'@'localhost' IDENTIFIED BY 'mot_de_passe';
-- Attribution de droits spécifiques
GRANT SELECT ON bibliotheque.livres TO 'lecteur'@'localhost';
-- Révocation de droits
REVOKE INSERT ON bibliotheque.livres FROM 'lecteur'@'localhost';
Exercices pratiques
Exercice 1 : Analyse d'architecture
Pour chaque niveau de l'architecture ANSI/SPARC, donnez un exemple concret dans le contexte d'une base de données de gestion scolaire.
Exercice 2 : Choix de SGBD
Pour chaque cas d'usage, justifiez le choix du SGBD : 1. Application mobile avec base de données locale 2. Site e-commerce avec forte charge 3. Système de gestion documentaire 4. Application d'analyse de réseaux sociaux
Exercice 3 : Sécurité
Identifiez les failles de sécurité dans ce code Python :
def authentifier_utilisateur(nom, mot_de_passe):
connexion = sqlite3.connect('users.db')
curseur = connexion.cursor()
requete = f"SELECT id FROM users WHERE nom='{nom}' AND password='{mot_de_passe}'"
curseur.execute(requete)
if curseur.fetchone():
return True
return False
Proposez une version corrigée.
Tendances actuelles
Cloud et bases de données
- Database as a Service (DBaaS) : Amazon RDS, Google Cloud SQL
- Bases de données serverless : AWS Aurora Serverless
- Multi-cloud : Portabilité entre fournisseurs
Big Data et analytique
- Data Warehouses : Stockage pour l'analyse
- Data Lakes : Stockage de données brutes
- OLAP vs OLTP : Optimisation pour l'analyse vs transactions
Intelligence artificielle
- Bases de données vectorielles : Pour l'IA et le machine learning
- Optimisation automatique : Tuning automatique des performances
- Requêtes en langage naturel : Interface conversationnelle
Conclusion
Les SGBD sont des outils essentiels dans le paysage informatique moderne. Leur évolution continue répond aux besoins croissants de : - Performance : Gestion de volumes de données toujours plus importants - Disponibilité : Systèmes fonctionnant 24h/24, 7j/7 - Sécurité : Protection contre les cyberattaques - Flexibilité : Adaptation aux nouveaux types de données et d'usages
La maîtrise des concepts fondamentaux des SGBD est cruciale pour tout développeur ou administrateur de systèmes d'information.