# Concepts génériques

### Qu'est-ce qu'une base de données ?

Une **base de données** est un système organisé permettant de stocker, gérer et récupérer des données de manière structurée et efficace.

Contrairement à des fichiers texte ou CSV, une base de données offre :

- **Structure organisée** : Les données sont organisées selon un modèle défini
- **Accès concurrent** : Plusieurs utilisateurs peuvent lire et écrire simultanément
- **Intégrité des données** : Mécanismes de validation et de contraintes
- **Performances** : Indexation et optimisation des requêtes
- **Sécurité** : Gestion des droits d'accès et authentification

<p class="callout info">En 2025, plus de 90% des applications web et mobiles utilisent une base de données.  
Les SGBD relationnels représentent environ 60% du marché, le NoSQL gagnant progressivement du terrain.</p>

### Le SGBD (Système de Gestion de Base de Données)

Un **SGBD** (ou **DBMS** en anglais pour `Database Management System`) est un logiciel qui permet de créer, gérer et interroger une base de données.

Le SGBD fait l'interface entre l'application (ou l'utilisateur) et les données stockées sur disque.

<p class="callout success">Dans ce cours, nous nous concentrerons sur les SGBD relationnels, notamment **MySQL** (et son fork **MariaDB**) ainsi que **PostgreSQL**.</p>

### Les deux grandes familles

Il existe deux grandes familles de bases de données :

#### Bases de données relationnelles (SQL)

Les bases de données relationnelles organisent les données sous forme de **tables** (aussi appelées relations).

Chaque table contient :

- **Des colonnes** (champs) définissant le type de données
- **Des lignes** (enregistrements) contenant les données
- **Une clé primaire** identifiant de manière unique chaque ligne

Les tables peuvent être reliées entre elles via des **clés étrangères**, permettant d'établir des relations.

On interroge ces bases avec le langage **SQL** (Structured Query Language).

Exemples de SGBD relationnels :

- **MySQL / MariaDB** : MySQL est l'un des SGBD les plus populaires. MariaDB en est un fork compatible, créé par les fondateurs originaux de MySQL.
- **PostgreSQL** : SGBD open-source réputé pour sa robustesse et ses fonctionnalités avancées.

#### Bases de données NoSQL

NoSQL signifie "Not Only SQL". Ces bases de données ne suivent pas le modèle relationnel classique.

Il existe plusieurs types de bases NoSQL :

- **Bases documentaires** : Stockent des documents JSON/XML (ex: MongoDB)
- **Bases clé-valeur** : Stockent des paires clé-valeur simples (ex: Redis)
- **Bases orientées graphes** : Optimisées pour les relations complexes (ex: Neo4j)
- **Bases orientées colonnes** : Stockent les données par colonnes plutôt que par lignes (ex: Cassandra)

Les bases NoSQL sont particulièrement adaptées aux données non structurées, aux gros volumes et à la scalabilité horizontale.

### Relationnel vs NoSQL

Voici un comparatif entre les deux approches :

<table id="bkmrk-caract%C3%A9ristique-rela" style="width: 100%; height: 302.094px;"><thead><tr style="height: 34.1094px;"><th style="width: 17.1595%; height: 34.1094px;">**Caractéristique**</th><th style="width: 37.191%; height: 34.1094px;">**Relationnel (SQL)**</th><th style="width: 45.6496%; height: 34.1094px;">**NoSQL**</th></tr></thead><tbody><tr style="height: 55.2188px;"><td style="width: 17.1595%; height: 55.2188px;">**Structure**</td><td style="width: 37.191%; height: 55.2188px;">Schéma fixe, tables avec colonnes définies</td><td style="width: 45.6496%; height: 55.2188px;">Schéma flexible, structure variable</td></tr><tr style="height: 34.1094px;"><td style="width: 17.1595%; height: 34.1094px;">**Relations**</td><td style="width: 37.191%; height: 34.1094px;">Clés étrangères, jointures natives</td><td style="width: 45.6496%; height: 34.1094px;">Relations moins formelles</td></tr><tr style="height: 34.1094px;"><td style="width: 17.1595%; height: 34.1094px;">**Langage**</td><td style="width: 37.191%; height: 34.1094px;">SQL standardisé</td><td style="width: 45.6496%; height: 34.1094px;">API spécifiques à chaque SGBD</td></tr><tr style="height: 55.2188px;"><td style="width: 17.1595%; height: 55.2188px;">**Cas d'usage**</td><td style="width: 37.191%; height: 55.2188px;">Applications transactionnelles, données structurées</td><td style="width: 45.6496%; height: 55.2188px;">Big data, données non structurées, temps réel</td></tr></tbody></table>

### Quel type choisir ?

Le choix entre relationnel et NoSQL dépend du cas d'usage :

**Choisir une base relationnelle (SQL) si :**

- Les données sont structurées et les relations entre elles sont importantes
- L'intégrité des données est critique (banque, e-commerce, gestion)
- Les requêtes complexes avec jointures sont fréquentes
- Le schéma des données est stable
- Conformité ACID nécessaire

**Choisir une base NoSQL si :**

- Les données sont non structurées ou semi-structurées
- Le schéma évolue fréquemment
- Besoin de scalabilité horizontale massive
- Performance en lecture/écriture prioritaire sur la cohérence immédiate
- Traitement de gros volumes (Big Data, IoT, logs)

<p class="callout success">Dans ce cours, nous nous concentrons sur les bases de données **relationnelles**, qui restent le choix par défaut pour la majorité des applications web et métier.</p>