sgbdr

2025-09-11 20:35:45 +02:00
parent 4b580e484d
commit 3b7f47eea5
4 changed files with 630 additions and 8 deletions

16
bdd.md

@@ -34,7 +34,7 @@ Il existe plusieurs types de bases de données, chacun conçu pour répondre à
### Base de données relationnelle (SGBDR - RDBMS)
Les bases de données relationnelles stockent les données dans des tables avec des lignes et des colonnes. Elles utilisent un langage appelé SQL (Structured Query Language) pour gérer et interroger les données. Les exemples de systèmes de gestion de bases de données relationnelles (SGBDR) incluent MySQL, PostgreSQL, Oracle Database, Microsoft SQL Server, et SQLite. Ce modèle est le plus ancien et le plus répendu des systèmes de base de données.
Les bases de données relationnelles stockent les données dans des tables avec des lignes et des colonnes. Elles utilisent un langage appelé SQL (Structured Query Language) pour gérer et interroger les données. Les exemples de systèmes de gestion de bases de données relationnelles (SGBDR) incluent MySQL, PostgreSQL, Oracle Database, Microsoft SQL Server, et SQLite. Ce modèle est le plus ancien et le plus répandu des systèmes de base de données.
### Base de données NoSQL
@@ -79,14 +79,14 @@ RDBMS
- [Base de données relationnelle](sgbdr)
- Le [langage SQL](sql)
- Les [jointures](sql/jointure)
- Les [déclencheurs](sql/trigger)
- Les [vues](sql/vues)
- Le principe [ACID](sql/acid)
- Les [transactions](sql/tcl)
- Les [jointures](jointure)
- Les [déclencheurs](trigger)
- Les [vues](vues)
- Le principe [ACID](acid)
- Les [transactions](tcl)
- Le [format JSON](json)
### Travaux dirigés
- [Travaux dirigés 1](sgbdr/td)
- [Travaux dirigés 2](sgbdr/td2)
- [Travaux dirigés 1](td1)
- [Travaux dirigés 2](td2)

355
sgbdr.md Normal file

@@ -0,0 +1,355 @@
---
title: Système de gestion de bases de données relationnelles
---
Les bases de données relationnelles sont un élément clé de la gestion de données dans de nombreuses applications informatiques. Elles fournissent une structure organisée pour stocker, gérer et récupérer des informations.
### Qu'est-ce qu'une base de données relationnelle ?
> Une base de données relationnelle est une collection de données structurées, organisées en tables. Chaque table est composée de lignes (enregistrements) et de colonnes (champs). Chaque ligne représente une entité unique, comme un client, un produit ou une commande, tandis que chaque colonne représente un attribut de ces entités.
{class=definition}
### Terminologie clé
- **Table :** Une structure qui stocke des données sous forme de lignes et de colonnes.
- **Enregistrement :** Correspond à une ligne de la table. Il représente une instance spécifique d'une entité (par exemple, un client).
- **Champ :** Correspond à une colonne de la table. Il représente une propriété spécifique des entités (par exemple, le nom ou l'âge d'un client).
- **Clé primaire :** Une colonne (ou un groupe de colonnes) qui identifie de manière **unique** chaque enregistrement dans une table.
- **Clé étrangère :** Une colonne dans une table qui établit une relation avec la clé primaire d'une autre table, créant ainsi un lien entre les tables.
### Exemple
Prenons un exemple simple d'une base de données relationnelle pour une bibliothèque :
**Table "Livres" :**
| ID | Titre | Auteur | Année |
|----|------------------------|----------------|------:|
| 1 | La planète des singes | Pierre Boulle | 1963 |
| 2 | 1984 | George Orwell | 1949 |
| 3 | Le meilleur des mondes | Aldous Huxley | 1932 |
**Table "Emprunts" :**
| ID | LivreID | Emprunteur | Date |
|----|---------|--------------|------------|
| 1 | 2 | Alice Dupont | 2024-05-15 |
| 2 | 1 | Marc Martin | 2024-06-02 |
Ici, la table "Emprunts" a une clé étrangère "LivreID" qui est liée à la clé primaire "ID" de la table "Livres", établissant une relation entre les deux tables.
### Avantages des bases de données relationnelles
- **Structure organisée :** Les données sont organisées en tables, ce qui permet une gestion efficace.
- **Relations :** Les bases de données relationnelles peuvent gérer des **relations** entre différentes entités, assurant l'intégrité des données.
- **Flexibilité :** Les requêtes SQL (Structured Query Language) permettent de récupérer des données complexes en utilisant des jointures, des filtrages et des regroupements.
- **Sécurité :** Les systèmes de gestion de bases de données (SGBD) offrent des mécanismes de contrôle d'accès pour protéger les données sensibles.
En résumé, les bases de données relationnelles offrent une manière robuste et efficace de stocker et gérer des données dans une variété d'applications, allant des systèmes d'inventaire aux applications bancaires en passant par les sites web dynamiques.
## Schéma entité-relation (ER)
Un schéma entité-relation (ER) est un modèle de données utilisé en conception de bases de données pour représenter la structure et les relations entre les données. Il est particulièrement utile pour décrire comment les entités (c'est-à-dire les objets, les concepts ou les éléments du monde réel) interagissent les unes avec les autres au sein d'un système d'information. Le schéma entité-relation repose sur deux principaux composants : les entités et les relations.
### Entités
Les entités représentent des objets, des concepts ou des éléments du monde réel qui sont importants pour le système d'information. Par exemple, dans un système de gestion de bibliothèque, les entités pourraient être "Livres", "Auteurs", "Emprunteurs" et "Bibliothèques". Chaque entité est décrite par un ensemble d'attributs qui capturent ses caractéristiques. Par exemple, l'entité "Livres" pourrait avoir des attributs tels que "Titre", "Auteur", "Année de publication" et "numéro ISBN".
### Relations
Les relations représentent les liens et les interactions entre les entités. Elles décrivent comment les entités sont connectées les unes aux autres. Par exemple, une relation "Emprunt" pourrait lier l'entité "Livres" à l'entité "Emprunteurs" pour indiquer qu'un emprunteur a emprunté un livre à une certaine date. Les relations peuvent avoir des attributs qui décrivent davantage les détails de l'interaction.
### Cardinalité
La cardinalité d'une relation définit combien d'entités d'un côté de la relation sont associées à combien d'entités de l'autre côté. Par exemple, une relation "Un à Un" signifie qu'une entité d'un côté est associée à une entité de l'autre côté, tandis qu'une relation "Un à Plusieurs" signifie qu'une entité d'un côté est associée à plusieurs entités de l'autre côté.
### Modèle conceptuel
Le schéma entité-relation est souvent considéré comme un modèle conceptuel, car il se concentre sur la représentation abstraite des données et de leurs relations sans se préoccuper des détails d'implémentation. Il s'agit d'une étape importante dans la conception d'une base de données, car elle permet de visualiser la structure des données et les interactions entre elles **avant** de passer à la création physique de la base de données.
Une fois le schéma entité-relation créé, il peut servir de base pour la conception et la création de la base de données réelle à l'aide d'un système de gestion de base de données (SGBD) tel que MySQL, PostgreSQL, Oracle Database, etc. Le schéma entité-relation est un outil précieux pour communiquer avec les parties prenantes du projet, comprendre les besoins en matière de données et s'assurer que la base de données est conçue de manière appropriée pour prendre en charge les opérations et les requêtes requises.
<svg width="627" height="263" viewBox="0 0 700 280" xmlns="http://www.w3.org/2000/svg">
<!-- Association DIRIGER -->
<g>
<line x1="205" y1="127" x2="205" y2="43" stroke="#66bd63" stroke-width="2"/>
<line x1="325" y1="127" x2="205" y2="43" stroke="#66bd63" stroke-width="2"/>
<g>
<path d="M225 18 a14 14 90 0 1 14 14 V43 h-68 V32 a14 14 90 0 1 14 -14" fill="#a6d96a" stroke="#a6d96a" stroke-width="0"/>
<path d="M239 43 v11 a14 14 90 0 1 -14 14 H185 a14 14 90 0 1 -14 -14 V43 H68" fill="#d9ef8b" stroke="#d9ef8b" stroke-width="0"/>
<rect x="171" y="18" width="68" height="50" fill="none" rx="14" stroke="#66bd63" stroke-width="2"/>
<line x1="171" y1="43" x2="239" y2="43" stroke="#66bd63" stroke-width="1"/>
<text x="178" y="35.75" fill="#000000" font-family="Verdana" font-size="12">DIRIGER</text>
</g>
<text x="210" y="85" fill="#d73027" font-family="Verdana" font-size="12">0,N</text>
<text x="258" y="109.97" fill="#d73027" font-family="Verdana" font-size="12">0,1</text>
</g>
<!-- Association REQUERIR -->
<g>
<line x1="325" y1="127" x2="325" y2="43" stroke="#66bd63" stroke-width="2"/>
<line x1="449" y1="43" x2="325" y2="43" stroke="#66bd63" stroke-width="2"/>
<g>
<path d="M353 18 a14 14 90 0 1 14 14 V43 h-84 V32 a14 14 90 0 1 14 -14" fill="#a6d96a" stroke="#a6d96a" stroke-width="0"/>
<path d="M367 43 v11 a14 14 90 0 1 -14 14 H297 a14 14 90 0 1 -14 -14 V43 H84" fill="#d9ef8b" stroke="#d9ef8b" stroke-width="0"/>
<rect x="283" y="18" width="84" height="50" fill="none" rx="14" stroke="#66bd63" stroke-width="2"/>
<line x1="283" y1="43" x2="367" y2="43" stroke="#66bd63" stroke-width="1"/>
<text x="293" y="35.75" fill="#000000" font-family="Verdana" font-size="12">REQUÉRIR</text>
<text x="290" y="60.8" fill="#000000" font-family="Verdana" font-size="12">qté requise</text>
</g>
<text x="330" y="85" fill="#d73027" font-family="Verdana" font-size="12">1,N</text>
<text x="381" y="60" fill="#d73027" font-family="Verdana" font-size="12">0,N</text>
</g>
<!-- Association COMPOSER -->
<g>
<path d="M449 43 C483.67 9.67 525 9.67 573 43" fill="none" stroke="#66bd63" stroke-width="2"/>
<path d="M449 43 C483.67 76.33 525 76.33 573 43" fill="none" stroke="#66bd63" stroke-width="2"/>
<g>
<path d="M601 18 a14 14 90 0 1 14 14 V43 h-84 V32 a14 14 90 0 1 14 -14" fill="#a6d96a" stroke="#a6d96a" stroke-width="0"/>
<path d="M615 43 v11 a14 14 90 0 1 -14 14 H545 a14 14 90 0 1 -14 -14 V43 H84" fill="#d9ef8b" stroke="#d9ef8b" stroke-width="0"/>
<rect x="531" y="18" width="84" height="50" fill="none" rx="14" stroke="#66bd63" stroke-width="2"/>
<line x1="531" y1="43" x2="615" y2="43" stroke="#66bd63" stroke-width="1"/>
<text x="538" y="35.75" fill="#000000" font-family="Verdana" font-size="12">COMPOSER</text>
<text x="538" y="60.8" fill="#000000" font-family="Verdana" font-size="12">quantité</text>
</g>
<text x="495" y="37" fill="#d73027" font-family="Verdana" font-size="12">0,N</text>
<text x="495" y="58" fill="#d73027" font-family="Verdana" font-size="12">0,N</text>
</g>
<!-- Association DF0 -->
<g>
<line x1="71" y1="43" x2="71" y2="127" stroke="#66bd63" stroke-width="2"/>
<line x1="205" y1="127" x2="71" y2="127" stroke="#66bd63" stroke-width="2"/>
<g>
<circle cx="71" cy="127" r="16" stroke="#66bd63" stroke-width="2" fill="#a6d96a"/>
<text x="62" y="131" fill="#000000" font-family="Verdana" font-size="12">DF</text>
</g>
<text x="76" y="94" fill="#d73027" font-family="Verdana" font-size="12">1,1</text>
<line x1="76" y1="96" x2="97" y2="96" stroke="#d73027" stroke-width="1"/>
<text x="131" y="144" fill="#d73027" font-family="Verdana" font-size="12">0,N</text>
</g>
<!-- Association FOURNIR -->
<g>
<line x1="325" y1="127" x2="449" y2="127" stroke="#66bd63" stroke-width="2"/>
<line x1="449" y1="43" x2="449" y2="127" stroke="#66bd63" stroke-width="2"/>
<line x1="449" y1="220" x2="449" y2="127" stroke="#66bd63" stroke-width="2"/>
<g>
<path d="M476 102 a14 14 90 0 1 14 14 V127 h-82 V116 a14 14 90 0 1 14 -14" fill="#a6d96a" stroke="#a6d96a" stroke-width="0"/>
<path d="M490 127 v11 a14 14 90 0 1 -14 14 H422 a14 14 90 0 1 -14 -14 V127 H82" fill="#d9ef8b" stroke="#d9ef8b" stroke-width="0"/>
<rect x="408" y="102" width="82" height="50" fill="none" rx="14" stroke="#66bd63" stroke-width="2"/>
<line x1="408" y1="127" x2="490" y2="127" stroke="#66bd63" stroke-width="1"/>
<text x="421" y="119.75" fill="#000000" font-family="Verdana" font-size="12">FOURNIR</text>
<text x="415" y="144.8" fill="#000000" font-family="Verdana" font-size="12">qté fournie</text>
</g>
<text x="371" y="144" fill="#d73027" font-family="Verdana" font-size="12">1,N</text>
<text x="454" y="94" fill="#d73027" font-family="Verdana" font-size="12">1,N</text>
<text x="454" y="178" fill="#d73027" font-family="Verdana" font-size="12">1,N</text>
</g>
<!-- Association EMPLOYER -->
<g>
<line x1="205" y1="127" x2="205" y2="220" stroke="#66bd63" stroke-width="2"/>
<line x1="71" y1="220" x2="205" y2="220" stroke="#66bd63" stroke-width="2"/>
<g>
<path d="M231 195 a14 14 90 0 1 14 14 V220 h-80 V209 a14 14 90 0 1 14 -14" fill="#a6d96a" stroke="#a6d96a" stroke-width="0"/>
<path d="M245 220 v11 a14 14 90 0 1 -14 14 H179 a14 14 90 0 1 -14 -14 V220 H80" fill="#d9ef8b" stroke="#d9ef8b" stroke-width="0"/>
<rect x="165" y="195" width="80" height="50" fill="none" rx="14" stroke="#66bd63" stroke-width="2"/>
<line x1="165" y1="220" x2="245" y2="220" stroke="#66bd63" stroke-width="1"/>
<text x="173" y="212.75" fill="#000000" font-family="Verdana" font-size="12">EMPLOYER</text>
</g>
<text x="179" y="178" fill="#d73027" font-family="Verdana" font-size="12">1,1</text>
<text x="138" y="237" fill="#d73027" font-family="Verdana" font-size="12">1,N</text>
</g>
<!-- Association TRAVAILLER -->
<g>
<line x1="205" y1="127" x2="325" y2="220" stroke="#66bd63" stroke-width="2"/>
<line x1="325" y1="127" x2="325" y2="220" stroke="#66bd63" stroke-width="2"/>
<g>
<path d="M356 195 a14 14 90 0 1 14 14 V220 h-90 V209 a14 14 90 0 1 14 -14" fill="#a6d96a" stroke="#a6d96a" stroke-width="0"/>
<path d="M370 220 v11 a14 14 90 0 1 -14 14 H294 a14 14 90 0 1 -14 -14 V220 H90" fill="#d9ef8b" stroke="#d9ef8b" stroke-width="0"/>
<rect x="280" y="195" width="90" height="50" fill="none" rx="14" stroke="#66bd63" stroke-width="2"/>
<line x1="280" y1="220" x2="370" y2="220" stroke="#66bd63" stroke-width="1"/>
<text x="287" y="212.75" fill="#000000" font-family="Verdana" font-size="12">TRAVAILLER</text>
</g>
<text x="227.68" y="178" fill="#d73027" font-family="Verdana" font-size="12">0,N</text>
<text x="330" y="178" fill="#d73027" font-family="Verdana" font-size="12">1,N</text>
</g>
<!-- Association CONTROLER -->
<g>
<path d="M449 220 C491.67 186.67 533 186.67 573 220" fill="none" stroke="#66bd63" stroke-width="2"/>
<polygon points="528.0 196.68 515.02 200.08 520.17 195.03 517.5 188.33" fill="#66bd63" stroke-width="0"/>
<path d="M449 220 C491 253.33 532.33 253.33 573 220" fill="none" stroke="#66bd63" stroke-width="2"/>
<g>
<path d="M604 195 a14 14 90 0 1 14 14 V220 h-90 V209 a14 14 90 0 1 14 -14" fill="#a6d96a" stroke="#a6d96a" stroke-width="0"/>
<path d="M618 220 v11 a14 14 90 0 1 -14 14 H542 a14 14 90 0 1 -14 -14 V220 H90" fill="#d9ef8b" stroke="#d9ef8b" stroke-width="0"/>
<rect x="528" y="195" width="90" height="50" fill="none" rx="14" stroke="#66bd63" stroke-width="2"/>
<line x1="528" y1="220" x2="618" y2="220" stroke="#66bd63" stroke-width="1"/>
<text x="535" y="212.75" fill="#000000" font-family="Verdana" font-size="12">CONTRÔLER</text>
</g>
<text x="501" y="214" fill="#d73027" font-family="Verdana" font-size="12">0,N</text>
<text x="501" y="235" fill="#d73027" font-family="Verdana" font-size="12">0,1</text>
</g>
<!-- Entity AYANT_DROIT -->
<g>
<g>
<rect x="16" y="9" width="110" height="25" fill="#fdae61" stroke="none" stroke-width="0" opacity="1"/>
<rect x="16" y="34" width="110" height="43" fill="#fee08b" stroke="none" stroke-width="0" opacity="1"/>
<rect x="16" y="9" width="110" height="68" fill="none" stroke="#f46d43" stroke-width="2" opacity="1"/>
<line x1="16" y1="34" x2="126" y2="34" stroke="#f46d43" stroke-width="1"/>
</g>
<text x="28" y="26.75" fill="#000000" font-family="Verdana" font-size="12">AYANT&#45;DROIT</text>
<text x="21" y="51.8" fill="#000000" font-family="Verdana" font-size="12">nom ayant&#45;droit</text>
<line x1="21" y1="54" x2="120" y2="54" stroke="#000000" stroke-width="1" stroke-dasharray="4"/>
<text x="21" y="68.8" fill="#000000" font-family="Verdana" font-size="12">lien</text>
</g>
<!-- Entity PIECE -->
<g>
<g>
<rect x="408" y="9" width="82" height="25" fill="#fdae61" stroke="none" stroke-width="0" opacity="1"/>
<rect x="408" y="34" width="82" height="43" fill="#fee08b" stroke="none" stroke-width="0" opacity="1"/>
<rect x="408" y="9" width="82" height="68" fill="none" stroke="#f46d43" stroke-width="2" opacity="1"/>
<line x1="408" y1="34" x2="490" y2="34" stroke="#f46d43" stroke-width="1"/>
</g>
<text x="431" y="26.75" fill="#000000" font-family="Verdana" font-size="12">PIÈCE</text>
<text x="413" y="51.8" fill="#000000" font-family="Verdana" font-size="12">réf. pièce</text>
<line x1="413" y1="54" x2="470" y2="54" stroke="#000000" stroke-width="1"/>
<text x="413" y="68.8" fill="#000000" font-family="Verdana" font-size="12">libellé pièce</text>
</g>
<!-- Entity EMPLOYE -->
<g>
<g>
<rect x="158" y="93" width="94" height="25" fill="#fdae61" stroke="none" stroke-width="0" opacity="1"/>
<rect x="158" y="118" width="94" height="43" fill="#fee08b" stroke="none" stroke-width="0" opacity="1"/>
<rect x="158" y="93" width="94" height="68" fill="none" stroke="#f46d43" stroke-width="2" opacity="1"/>
<line x1="158" y1="118" x2="252" y2="118" stroke="#f46d43" stroke-width="1"/>
</g>
<text x="177" y="110.75" fill="#000000" font-family="Verdana" font-size="12">EMPLOYÉ</text>
<text x="163" y="135.8" fill="#000000" font-family="Verdana" font-size="12">matricule</text>
<line x1="163" y1="138" x2="220" y2="138" stroke="#000000" stroke-width="1"/>
<text x="163" y="152.8" fill="#000000" font-family="Verdana" font-size="12">nom employé</text>
</g>
<!-- Entity PROJET -->
<g>
<g>
<rect x="284" y="93" width="82" height="25" fill="#fdae61" stroke="none" stroke-width="0" opacity="1"/>
<rect x="284" y="118" width="82" height="43" fill="#fee08b" stroke="none" stroke-width="0" opacity="1"/>
<rect x="284" y="93" width="82" height="68" fill="none" stroke="#f46d43" stroke-width="2" opacity="1"/>
<line x1="284" y1="118" x2="366" y2="118" stroke="#f46d43" stroke-width="1"/>
</g>
<text x="302" y="110.75" fill="#000000" font-family="Verdana" font-size="12">PROJET</text>
<text x="289" y="135.8" fill="#000000" font-family="Verdana" font-size="12">num. projet</text>
<line x1="289" y1="138" x2="361" y2="138" stroke="#000000" stroke-width="1"/>
<text x="289" y="152.8" fill="#000000" font-family="Verdana" font-size="12">nom projet</text>
</g>
<!-- Entity DEPARTEMENT -->
<g>
<g>
<rect x="9" y="186" width="124" height="25" fill="#fdae61" stroke="none" stroke-width="0" opacity="1"/>
<rect x="9" y="211" width="124" height="43" fill="#fee08b" stroke="none" stroke-width="0" opacity="1"/>
<rect x="9" y="186" width="124" height="68" fill="none" stroke="#f46d43" stroke-width="2" opacity="1"/>
<line x1="9" y1="211" x2="133" y2="211" stroke="#f46d43" stroke-width="1"/>
</g>
<text x="26" y="203.75" fill="#000000" font-family="Verdana" font-size="12">DÉPARTEMENT</text>
<text x="14" y="228.8" fill="#000000" font-family="Verdana" font-size="12">num. département</text>
<line x1="14" y1="231" x2="128" y2="231" stroke="#000000" stroke-width="1"/>
<text x="14" y="245.8" fill="#000000" font-family="Verdana" font-size="12">nom département</text>
</g>
<!-- Entity SOCIETE -->
<g>
<g>
<rect x="402" y="186" width="94" height="25" fill="#fdae61" stroke="none" stroke-width="0" opacity="1"/>
<rect x="402" y="211" width="94" height="43" fill="#fee08b" stroke="none" stroke-width="0" opacity="1"/>
<rect x="402" y="186" width="94" height="68" fill="none" stroke="#f46d43" stroke-width="2" opacity="1"/>
<line x1="402" y1="211" x2="496" y2="211" stroke="#f46d43" stroke-width="1"/>
</g>
<text x="422" y="203.75" fill="#000000" font-family="Verdana" font-size="12">SOCIÉTÉ</text>
<text x="407" y="228.8" fill="#000000" font-family="Verdana" font-size="12">num. société</text>
<line x1="407" y1="231" x2="486" y2="231" stroke="#000000" stroke-width="1"/>
<text x="407" y="245.8" fill="#000000" font-family="Verdana" font-size="12">raison sociale</text>
</g>
</svg>
## Formes normales
Les formes normales sont des règles ou des critères utilisés dans la conception de bases de données relationnelles pour organiser les données de manière à réduire la redondance et améliorer l'intégrité des données. Elles permettent de structurer une base de données de façon à minimiser les anomalies de mise à jour, d'insertion et de suppression. Il existe plusieurs formes normales, chacune apportant des améliorations spécifiques par rapport à la précédente.
### 1NF Première forme normale
La première forme normale impose les conditions suivantes :
- **Atomicité** : Chaque colonne d'une table doit contenir des valeurs atomiques, c'est-à-dire indivisibles. Par exemple, une colonne ne doit pas contenir une liste de valeurs ou une valeur composite.
- **Absence de répétition** : Les enregistrements doivent être uniques, et chaque colonne doit contenir un seul type de données.
|Immatriculation | Modèle | Caractéristiques
|----------------|---------|--------------
| TT-802-AX | Nissan | 4 roues motrices, ABS, toit ouvrant, peinture verte, 65 l, 140 cv
| QS-123-DB | Peugeot | jantes aluminium, peinture bleu, 50 l, 110 cv
| ID | Produit | Ingrédients
|----|---------------|--------------
| 1 | Sun Secure | octocrylène, dioxyde de titane
| 2 | UV Screen | acide para-aminobenzoïque, taurate copolymer, ceteareth-20
#### 2NF Deuxième forme normale
La deuxième forme normale est basée sur la première (ANF) et ajoute la condition suivante :
- **Dépendance fonctionnelle totale** : Tous les attributs non clés doivent dépendre **entièrement** de la clé primaire. En d'autres termes, il ne doit pas y avoir de dépendances partielles entre les colonnes. Si une colonne dépend seulement d'une partie de la clé primaire (dans le cas où celle-ci est composée), la table n'est pas en 2NF.
| N° Commande | N° Produit | NomClient | AdresseClient | Quantité
|-------------|------------|-----------|--------------------|--------:
| 1 | 101 | Dupont | 10 rue du Marché | 2
| 1 | 102 | Dupont | 10 rue du Marché | 1
| 2 | 103 | Martin | 22 avenue de Paris | 5
| 3 | 102 | Grosjean | 10 place Bleue | 3
La clé primaire de la table est composée de CommandeID et ProduitID
NomClient et AdresseClient dépendent uniquement de CommandeID, ce qui signifie qu'ils ne dépendent pas entièrement de la clé primaire composée (CommandeID, ProduitID). Ils dépendent seulement de la partie CommandeID.
#### 3NF Troisième forme normale
La troisième forme normale repose sur la deuxième (2NF) et ajoute la condition suivante :
- **Absence de dépendance transitive** : Aucune colonne non clé ne doit dépendre d'une autre colonne non clé. Autrement dit, chaque colonne non clé doit dépendre directement de la clé primaire.
|EmployéID | NomEmployé | Poste | Salaire | DépartementID |NomDépartement
|----------|------------|----------------|---------|---------------|---------------
|1 | Dupont | Ingénieur | 60000 | 101 |Informatique
|2 | Martin | Chef de projet | 75000 | 102 |Gestion
|3 | Durand | Technicien | 45000 | 101 |Informatique
Dans cette table, l'attribut NomDépartement dépend de DépartementID, qui lui-même dépend de EmployéID. Cette situation crée une dépendance transitive : EmployéID → DépartementID → NomDépartement. Par conséquent, la table ne respecte pas la 3NF, car NomDépartement dépend indirectement de la clé primaire EmployéID via une autre colonne non clé (DépartementID).
#### BCNF Forme normale de Boyce-Codd
La forme normale de Boyce-Codd est une extension de la 3NF et traite certains cas particuliers où la 3NF ne suffit pas. Elle impose :
- **Dépendance fonctionnelle stricte** : Pour chaque dépendance fonctionnelle, l'ensemble des attributs sur lequel une colonne dépend doit être une super-clé de la table.
#### 4NF Quatrième forme normale
La quatrième forme normale traite des dépendances multivaluées :
- **Aucune dépendance multivaluée** : Si un attribut dans une table dépend de la clé primaire, il ne doit pas y avoir de dépendance entre cet attribut et un autre ensemble d'attributs indépendant.
#### 5NF Cinquième forme normale
La cinquième forme normale traite de la décomposition en respectant les jointures :
- **Aucune dépendance de jointure** : Une table doit être décomposable en plus petites tables sans perte d'informations lors des jointures.
#### 6NF Sixième forme normale
La sixième forme normale, rarement utilisée, est destinée aux bases de données temporelles et impose une décomposition encore plus fine pour gérer les variations dans le temps.

62
td1.md Normal file

@@ -0,0 +1,62 @@
---
title: Travaux dirigés
---
## Schéma entités-relations
Le schéma entité-relation est l'étape préparatoire à la réalisation d'une base de données. il modélise sous forme graphique un problème réel.
### Exercice 1. Société de transport
Une société de transport possède une flotte de camion et plusieurs entrepots.
Cette société embauche des chauffeurs. Les camions sont basés à des entrepôts. Les camions sont affectés aux chauffeurs au jour le jour.
La nature du permis limite les camions que le chauffeur peut conduire.
### Exercice 2. système de maintenance
Une société possède un parc de machine. Ces machines sont placés dans des ateliers et les ateliers appartiennent à des sites (lieux) de fabrication. Une machine est caractérisée par sa marque et sa date d'achat. Les opérations de maintenance sont des cycles d'opérations à effectuer régulièrement sur une machine. Des opérateurs conduisent ces opérations et notent les résultats.
### Exercice 3. ERP (Enterprise resource planning)
Uns société achète des articles pour fabriquer des produits finis.
Un entrepôt permet de stocker à la fois les articles et les produits finis.
Les produits finis sont créés à partir des articles suivant une gamme de fabrication.
*****
Articles Produits Finis Gamme de fabrication Production Stockage
Nom Nom Nom Article Produit Fini Article
Prix d'achat Prix vente Nom Produit Fini Quantite Produit f
Quantité Date
******
Produit Gamme de fabrication Production Stockage
Nom Produit Produit Produit
Prix Produit Quantité Quantité
fini (o/n) Quantité Date
Activer les contraintes dans SQLite
PRAGMA foreign_keys = ON;
vous ne pouvez pas ajouter directement une contrainte de clé primaire à une table existante dans SQLite après sa création. Contrairement à certaines autres bases de données relationnelles, SQLite ne permet pas de modifier une table pour ajouter ou supprimer des contraintes de clé primaire après que la table a été créée.
- 1. Créez la nouvelle table avec la contrainte de clé primaire
CREATE TABLE new_table (
id INTEGER PRIMARY KEY,
column1 TEXT,
column2 INTEGER
);
-- 2. Copiez les données de l'ancienne table vers la nouvelle
INSERT INTO new_table (id, column1, column2)
SELECT id, column1, column2 FROM old_table;
-- 3. Supprimez l'ancienne table
DROP TABLE old_table;
-- 4. Renommez la nouvelle table avec le nom de l'ancienne table
ALTER TABLE new_table RENAME TO old_table;

205
td2.md Normal file

@@ -0,0 +1,205 @@
---
title: Travaux dirigés
---
### 1. Nombre de clients
```sql
select count(*) from customers;
```
### 2. Nombre d'albums
```sql
select count(*) from albums;
```
### 3. Nombre d'artistes
```sql
select count(*) from artists;
```
### 4. Liste des pays
```sql
select distinct country from customers;
```
Utilisation de `distinct` pour supprimer les doublons.
### 5. Nombre de clients par pays
```sql
select country, count(*) from customers group by Country order by count(*) desc;
```
### 6. Nombre de pistes par genre
```sql
select g.Name, count(*) as nb from tracks t
inner join genres g on g.GenreId = t.GenreId
group by g.GenreId order by nb desc;
```
### 7. Nombre d'albums par artiste
```sql
select a.Name, count(*) as nb from artists a
inner join albums b on b.ArtistId = a.ArtistId
group by a.Name order by nb desc;
```
### 8. Nombre de piste par artiste
```sql
select a.Name, count(*) as nb from artists a
inner join albums b on a2.ArtistId = a.ArtistId
inner join tracks t on t.AlbumId = b.AlbumId
group by a.Name
order by nb desc;
```
### 9. Nombre de minute de musique par album
```sql
select a.Title , sum(t.Milliseconds/60000) as duree
from tracks t
inner join albums a on a.AlbumId = t.AlbumId
group by a.Title
order by duree desc;
```
### 10. Recette par piste
```sql
select t.Name, sum(ii.UnitPrice*ii.Quantity) as recette
from tracks t
inner join invoice_items ii on ii.TrackId = t.TrackId
group by t.Name order by recette desc;
```
### 9. Recette par album
```sql
select a.Title, sum(ii.UnitPrice*ii.Quantity) as recette
from tracks t
inner join invoice_items ii on (ii.TrackId = t.TrackId)
inner join albums a on a.AlbumId = t.AlbumId
group by a.Title
order by recette desc;
```
### 10. Les 3 meilleurs clients
```sql
select c.FirstName, c.LastName, sum(i.Total) as total
from customers c
inner join invoices i on i.CustomerId = c.CustomerId
GROUP by c.CustomerId
order by total DESC
limit 3;
```
### 11. Les genres écoutés par Isabelle Mercier
```sql
select distinct g.Name from genres g
inner join tracks t on t.GenreId = g.GenreId
inner join invoice_items ii on ii.TrackId = t.TrackId
inner join invoices i on ii.InvoiceId = i.InvoiceId
inner join customers c on c.CustomerId = i.CustomerId
where c.FirstName = 'Isabelle' and c.LastName ='Mercier';
```
Attention l'égalité est stricte sur FirstName et LastName (respect des majuscules / minuscules)
## Utilisation des dates
### 12. Recette après le 01/05/2013
```sql
select sum(i.Total) from invoices i where i.InvoiceDate > DATETIME('2013-05-01');
```
### 13. Recette entre le 15/04/2012 et le 20/06/2012
```sql
select sum(i.Total)
from invoices i
where i.InvoiceDate between DATETIME('2012-04-15') and DATETIME('2012-06-20');
```
### 14. Recette du mois de février 2012
```sql
select sum(i.Total)
from invoices i
where STRFTIME('%m/%Y', i.InvoiceDate) = '02/2012'
```
STRFTIME (string from datetime) permet de formater au format de texte un date. Le format est complètement libre et personnalisable.
### 15. Recettes par mois
```sql
select STRFTIME('%Y-%m', i.InvoiceDate) as mois,
sum(i.Total)
from invoices i
group by mois
order by mois
```
### 16. Recette de l'année 2013
```sql
select sum(i.Total)
from invoices i
where STRFTIME('%Y', i.InvoiceDate) = '2013'
```
## Recherche sur le texte
### 17. Liste des pistes qui contiennent le mot Love
```sql
select t.Name from tracks t
where t.NAME LIKE '%love%';
```
L'opérateur LIKE ne tient pas compte de la différence minuscule/majuscule
### 18. Liste des pistes qui contiennent les lettres Sun
```sql
select t.Name from tracks t
where t.NAME LIKE '%SUN%';
```
### 19. Liste des pistes qui contiennent le mot Sun
```sql
select t.Name from tracks t
where t.NAME LIKE 'SUN %' OR
t.NAME LIKE '% SUN' OR
t.NAME LIKE '% SUN %';
```
## Cohérence
### 20. Le total de chaque facture est il juste ?
```sql
select i.Total, sum(ii.UnitPrice*ii.Quantity) as somme,
printf('%.20f', i.Total - sum(ii.UnitPrice*ii.Quantity))
from invoices i
inner join invoice_items ii on ii.InvoiceId = i.InvoiceId
group by i.InvoiceId
HAVING Abs(i.Total - somme) >= 0.01
```
ou en utilisant ROUND : HAVING i.Total <> Round(somme,2)
### 21. Existe t il des pistes dont le prix unitaire a évolué ?
```sql
select t.Name from tracks t
left join invoice_items ii on ii.TrackId = t.TrackId
where t.UnitPrice <> ii.UnitPrice
```