This commit is contained in:
2025-11-07 07:03:42 +01:00
parent d402a30650
commit e36c4f9f18

137
banque.md
View File

@@ -49,9 +49,6 @@ Un clients de la banque est appelé un titulaire. Il peut être une personne phy
- La suppression dun `holder` doit supprimer automatiquement la ligne correspondante dans `person` ou `company`. - La suppression dun `holder` doit supprimer automatiquement la ligne correspondante dans `person` ou `company`.
- Le type doit être contraint à `'PERSON'` ou `'COMPANY'`. - Le type doit être contraint à `'PERSON'` ou `'COMPANY'`.
### 1.6 Conclusion
#### Pourquoi séparer `person` et `company` ? #### Pourquoi séparer `person` et `company` ?
Parce que leurs attributs diffèrent (nom/prénom vs raison sociale). Parce que leurs attributs diffèrent (nom/prénom vs raison sociale).
@@ -96,12 +93,54 @@ erDiagram
- Le solde des comptes ne peuvent être négatifs. - Le solde des comptes ne peuvent être négatifs.
- Dans le cas d'un compte joint, les parts (_share_) de propriété d'un compte doivent pouvoir être précisées. - Dans le cas d'un compte joint, les parts (_share_) de propriété d'un compte doivent pouvoir être précisées.
### 2.1 Exemple de données ```mermaid
erDiagram
person {
bigint id PK
text firstname
text lastname
date birthdate
}
- Créez un compte individuel pour Françoise Zanetti. company {
- Ajouter un nouveau titulaire : Justin Hébrard né le 11/03/1993. bigint id PK
- Créez un compte joint à 50/50 pour Françoise et Justin. text registration_number
date creation_date
}
bank {
bigint id PK
}
holder {
bigint id PK
date creation_date
text type
}
account {
bigint id PK
date creation_date
decimal balance
text currency_code FK
}
account_holder {
bigint account_id FK
bigint holder_id FK
decimal share
}
%% Relations
person |o--|| holder : is
company |o--|| holder : is
bank |o--|| holder : is
holder }|--|{ account_holder : a
account_holder }|--|{ account : hold
```
### 3. Les opérations
```mermaid ```mermaid
erDiagram erDiagram
@@ -160,11 +199,8 @@ erDiagram
operation }o--|| account : concerne operation }o--|| account : concerne
``` ```
### 3. Les opérations
### 4. Les transactions ### 4. Les transactions
Chaque opération comporte au moins : Chaque opération comporte au moins :
* un **compte concerné** ; * un **compte concerné** ;
@@ -175,6 +211,11 @@ Chaque opération comporte au moins :
## **Méthode 1 : montant relatif (positif/négatif)** ## **Méthode 1 : montant relatif (positif/négatif)**
On stocke un seul champ `montant`.
* **Crédit** → montant positif
* **Débit** → montant négatif
### Exemple ### Exemple
| id | compte | date | montant | | id | compte | date | montant |
@@ -182,29 +223,24 @@ Chaque opération comporte au moins :
| 1 | 123 | 2025-11-06 | +200.00 | | 1 | 123 | 2025-11-06 | +200.00 |
| 2 | 123 | 2025-11-07 | -50.00 | | 2 | 123 | 2025-11-07 | -50.00 |
### Principe
On stocke un seul champ `montant`. ### Avantages
* **Crédit** → montant positif
* **Débit** → montant négatif
### ✅ Avantages
* **Simple à manipuler** pour les calculs (sommes, soldes, agrégations). * **Simple à manipuler** pour les calculs (sommes, soldes, agrégations).
* Pas besoin de colonne supplémentaire pour le sens. * Pas besoin de colonne supplémentaire pour le sens.
* Représente naturellement le comportement du solde dun compte. * Représente naturellement le comportement du solde dun compte.
### Inconvénients ### Inconvénients
* Le **signe a une signification métier** implicite → risque derreur dinterprétation. * Le **signe a une signification métier** implicite → risque derreur dinterprétation.
* **Moins lisible** pour les utilisateurs finaux ou pour des exports comptables. * **Moins lisible** pour les utilisateurs finaux ou pour des exports comptables.
* Pas toujours compatible avec les règles de la **comptabilité en partie double** (où débit et crédit doivent être visibles séparément). * Pas toujours compatible avec les règles de la **comptabilité en partie double** (où débit et crédit doivent être visibles séparément).
---
## **Méthode 2 : deux colonnes (débit / crédit)** ## **Méthode 2 : deux colonnes (débit / crédit)**
Deux colonnes numériques, lune pour le débit, lautre pour le crédit.
Une seule des deux contient une valeur non nulle.
### Exemple ### Exemple
| id | compte | date | debit | credit | | id | compte | date | debit | credit |
@@ -212,27 +248,24 @@ On stocke un seul champ `montant`.
| 1 | 123 | 2025-11-06 | 0.00 | 200.00 | | 1 | 123 | 2025-11-06 | 0.00 | 200.00 |
| 2 | 123 | 2025-11-07 | 50.00 | 0.00 | | 2 | 123 | 2025-11-07 | 50.00 | 0.00 |
### Principe ### Avantages
Deux colonnes numériques, lune pour le débit, lautre pour le crédit.
Une seule des deux contient une valeur non nulle.
### ✅ Avantages
* Très **clair visuellement** et **conforme aux usages comptables**. * Très **clair visuellement** et **conforme aux usages comptables**.
* Facilite les **exports vers des logiciels comptables**. * Facilite les **exports vers des logiciels comptables**.
* On peut facilement filtrer les débits et crédits séparément. * On peut facilement filtrer les débits et crédits séparément.
### Inconvénients ### Inconvénients
* **Redondance potentielle** (une des deux colonnes sera toujours à zéro). * **Redondance potentielle** (une des deux colonnes sera toujours à zéro).
* Les calculs de soldes nécessitent des **expressions plus complexes** : * Les calculs de soldes nécessitent des **expressions plus complexes** :
`SUM(credit) - SUM(debit)` `SUM(credit) - SUM(debit)`
* Risque dincohérence si les deux colonnes contiennent des valeurs remplies par erreur. * Risque dincohérence si les deux colonnes contiennent des valeurs remplies par erreur.
## **Méthode 3 : montant absolu + colonne sens ('D' / 'C')** ## **Méthode 3 : montant absolu + colonne sens ('D' / 'C')**
Le montant est toujours positif.
Le sens est indiqué par une lettre (`D` ou `C`).
### Exemple ### Exemple
| id | compte | date | montant | sens | | id | compte | date | montant | sens |
@@ -240,18 +273,14 @@ Une seule des deux contient une valeur non nulle.
| 1 | 123 | 2025-11-06 | 200.00 | C | | 1 | 123 | 2025-11-06 | 200.00 | C |
| 2 | 123 | 2025-11-07 | 50.00 | D | | 2 | 123 | 2025-11-07 | 50.00 | D |
### Principe
Le montant est toujours positif. ### Avantages
Le sens est indiqué par une lettre (`D` ou `C`).
### ✅ Avantages
* **Lisible** et **intuitif** : correspond au vocabulaire métier. * **Lisible** et **intuitif** : correspond au vocabulaire métier.
* Facilite la lecture humaine et les exports comptables. * Facilite la lecture humaine et les exports comptables.
* Pas dambiguïté sur le signe numérique. * Pas dambiguïté sur le signe numérique.
### Inconvénients ### Inconvénients
* Nécessite une **jointure logique** du sens pour les calculs : * Nécessite une **jointure logique** du sens pour les calculs :
`SUM(CASE WHEN sens='C' THEN montant ELSE -montant END)` `SUM(CASE WHEN sens='C' THEN montant ELSE -montant END)`
@@ -261,6 +290,8 @@ Le sens est indiqué par une lettre (`D` ou `C`).
## **Méthode 4 : montant absolu + colonne sens numérique (1 / -1)** ## **Méthode 4 : montant absolu + colonne sens numérique (1 / -1)**
Le montant est toujours positif, et une colonne numérique `sens` vaut `1` (crédit) ou `-1` (débit).
### Exemple ### Exemple
| id | compte | date | montant | sens | | id | compte | date | montant | sens |
@@ -268,25 +299,19 @@ Le sens est indiqué par une lettre (`D` ou `C`).
| 1 | 123 | 2025-11-06 | 200.00 | 1 | | 1 | 123 | 2025-11-06 | 200.00 | 1 |
| 2 | 123 | 2025-11-07 | 50.00 | -1 | | 2 | 123 | 2025-11-07 | 50.00 | -1 |
### Principe ### Avantages
Le montant est toujours positif, et une colonne numérique `sens` vaut `1` (crédit) ou `-1` (débit).
### ✅ Avantages
* **Compact et performant** pour les calculs : * **Compact et performant** pour les calculs :
`SUM(montant * sens)` donne directement le solde. `SUM(montant * sens)` donne directement le solde.
* Moins dambiguïté quun signe caché dans le montant. * Moins dambiguïté quun signe caché dans le montant.
* Combine la **rigueur du modèle mathématique** avec la **clarté du stockage absolu**. * Combine la **rigueur du modèle mathématique** avec la **clarté du stockage absolu**.
### Inconvénients ### Inconvénients
* **Moins lisible** pour un utilisateur non technique. * **Moins lisible** pour un utilisateur non technique.
* Moins standard pour la comptabilité classique (on préfère `D` / `C`). * Moins standard pour la comptabilité classique (on préfère `D` / `C`).
* Nécessite une convention claire sur la signification de `1` et `-1`. * Nécessite une convention claire sur la signification de `1` et `-1`.
---
## Synthèse comparative ## Synthèse comparative
| Méthode | Structure | Lisibilité | Facilité calculs | Conformité comptable | Risque d'erreur | | Méthode | Structure | Lisibilité | Facilité calculs | Conformité comptable | Risque d'erreur |
@@ -296,9 +321,6 @@ Le montant est toujours positif, et une colonne numérique `sens` vaut `1` (cré
| 3 | valeur + sens 'D'/'C' | ★★★ | ★★☆ | ★★★ | Faible | | 3 | valeur + sens 'D'/'C' | ★★★ | ★★☆ | ★★★ | Faible |
| 4 | valeur + sens 1/-1 | ★★☆ | ★★★ | ★★☆ | Moyen | | 4 | valeur + sens 1/-1 | ★★☆ | ★★★ | ★★☆ | Moyen |
---
### 5. Les devises ### 5. Les devises
@@ -378,17 +400,27 @@ erDiagram
operation }o--|| account : concerne operation }o--|| account : concerne
``` ```
### 1.4 Vérifications ---
## Séance 2
### 1. Exemple de données
- Créez un compte individuel pour Françoise Zanetti.
- Ajouter un nouveau titulaire : Justin Hébrard né le 11/03/1993.
- Créez un compte joint à 50/50 pour Françoise et Justin.
### 2. Vérifications
- Lister tous les titulaires. Pour réutiliser rapidement la requête enregistrer la dans une vue. - Lister tous les titulaires. Pour réutiliser rapidement la requête enregistrer la dans une vue.
- Supprimer un titulaire, vérifier que cela supprime l'individu ou la société correspondante. - Supprimer un titulaire, vérifier que cela supprime l'individu ou la société correspondante.
### 1.5 Pour aller plus loin ### 3. Pour aller plus loin
La banque souhaite désormais que toute personne titulaire dun compte ait au moins 15 ans à la date de création de sa fiche. Il n'y a pas de restriction sur l'âge de la société. La banque souhaite désormais que toute personne titulaire dun compte ait au moins 15 ans à la date de création de sa fiche. Il n'y a pas de restriction sur l'âge de la société.
## 3. L'intégrité des données ## 4. L'intégrité des données
Lorsque lon tente d'insèrer une nouvelle personne qui n'a pas l'âge requis. La ligne dans `holder` est d'abord créée, puis l'insertion dans `person` échoue à cause de la vérification d'âge. Mais la ligne du titulaire est toujours présente **sans être rattachée** à une personne. On parle alors d'enregistrement **orphelin**. Lorsque lon tente d'insèrer une nouvelle personne qui n'a pas l'âge requis. La ligne dans `holder` est d'abord créée, puis l'insertion dans `person` échoue à cause de la vérification d'âge. Mais la ligne du titulaire est toujours présente **sans être rattachée** à une personne. On parle alors d'enregistrement **orphelin**.
@@ -403,8 +435,7 @@ begin;
commit; commit;
``` ```
## 5. Procédure stockée
## 4. Procédure stockée
Pour fiabiliser le process et être sûr que l'execution s'effectue toujours dans une transaction, Pour fiabiliser le process et être sûr que l'execution s'effectue toujours dans une transaction,
nous allons encapsuler la création dun titulaire dans une **procédure stockée**. nous allons encapsuler la création dun titulaire dans une **procédure stockée**.
@@ -463,7 +494,7 @@ call create_person_holder('Félicien', 'Hébrard', '1970-10-15');
>[!NOTE] >[!NOTE]
> La procédure garantit l**atomicité** : soit tout est créé, soit rien. > La procédure garantit l**atomicité** : soit tout est créé, soit rien.
## 5. Cohérence des données ## 6. Cohérence des données
Écrire une requête pour vérifier la somme des parts Écrire une requête pour vérifier la somme des parts
@@ -558,7 +589,7 @@ ERROR: La somme des parts (1.1000) doit être égale à 1.0000
Jusquà présent, les dépôts et retraits modifiaient directement le solde dun compte. Jusquà présent, les dépôts et retraits modifiaient directement le solde dun compte.
Mais dans un vrai système bancaire ou comptable, chaque opération financière doit être enregistrée en double : Mais dans un vrai système bancaire ou comptable, chaque opération financière doit être enregistrée en double :
Un débit sur un compte (celui qui reçoit) - Un débit sur un compte (celui qui reçoit)
Un crédit sur un autre (celui qui cède) - Un crédit sur un autre (celui qui cède)
La somme des débits doit toujours être égale à la somme des crédits. La somme des débits doit toujours être égale à la somme des crédits.