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`.
- Le type doit être contraint à `'PERSON'` ou `'COMPANY'`.
### 1.6 Conclusion
#### Pourquoi séparer `person` et `company` ?
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.
- 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.
- Ajouter un nouveau titulaire : Justin Hébrard né le 11/03/1993.
- Créez un compte joint à 50/50 pour Françoise et Justin.
company {
bigint id PK
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
erDiagram
@@ -160,11 +199,8 @@ erDiagram
operation }o--|| account : concerne
```
### 3. Les opérations
### 4. Les transactions
Chaque opération comporte au moins :
* un **compte concerné** ;
@@ -175,6 +211,11 @@ Chaque opération comporte au moins :
## **Méthode 1 : montant relatif (positif/négatif)**
On stocke un seul champ `montant`.
* **Crédit** → montant positif
* **Débit** → montant négatif
### Exemple
| id | compte | date | montant |
@@ -182,29 +223,24 @@ Chaque opération comporte au moins :
| 1 | 123 | 2025-11-06 | +200.00 |
| 2 | 123 | 2025-11-07 | -50.00 |
### Principe
On stocke un seul champ `montant`.
* **Crédit** → montant positif
* **Débit** → montant négatif
### ✅ Avantages
### Avantages
* **Simple à manipuler** pour les calculs (sommes, soldes, agrégations).
* Pas besoin de colonne supplémentaire pour le sens.
* 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.
* **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).
---
## **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
| id | compte | date | debit | credit |
@@ -212,27 +248,24 @@ On stocke un seul champ `montant`.
| 1 | 123 | 2025-11-06 | 0.00 | 200.00 |
| 2 | 123 | 2025-11-07 | 50.00 | 0.00 |
### Principe
Deux colonnes numériques, lune pour le débit, lautre pour le crédit.
Une seule des deux contient une valeur non nulle.
### ✅ Avantages
### Avantages
* Très **clair visuellement** et **conforme aux usages comptables**.
* Facilite les **exports vers des logiciels comptables**.
* 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).
* Les calculs de soldes nécessitent des **expressions plus complexes** :
`SUM(credit) - SUM(debit)`
* Risque dincohérence si les deux colonnes contiennent des valeurs remplies par erreur.
## **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
| 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 |
| 2 | 123 | 2025-11-07 | 50.00 | D |
### Principe
Le montant est toujours positif.
Le sens est indiqué par une lettre (`D` ou `C`).
### ✅ Avantages
### Avantages
* **Lisible** et **intuitif** : correspond au vocabulaire métier.
* Facilite la lecture humaine et les exports comptables.
* Pas dambiguïté sur le signe numérique.
### Inconvénients
### Inconvénients
* Nécessite une **jointure logique** du sens pour les calculs :
`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)**
Le montant est toujours positif, et une colonne numérique `sens` vaut `1` (crédit) ou `-1` (débit).
### Exemple
| 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 |
| 2 | 123 | 2025-11-07 | 50.00 | -1 |
### Principe
Le montant est toujours positif, et une colonne numérique `sens` vaut `1` (crédit) ou `-1` (débit).
### ✅ Avantages
### Avantages
* **Compact et performant** pour les calculs :
`SUM(montant * sens)` donne directement le solde.
* Moins dambiguïté quun signe caché dans le montant.
* 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 standard pour la comptabilité classique (on préfère `D` / `C`).
* Nécessite une convention claire sur la signification de `1` et `-1`.
---
## Synthèse comparative
| 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 |
| 4 | valeur + sens 1/-1 | ★★☆ | ★★★ | ★★☆ | Moyen |
---
### 5. Les devises
@@ -378,17 +400,27 @@ erDiagram
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.
- 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é.
## 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**.
@@ -403,8 +435,7 @@ begin;
commit;
```
## 4. Procédure stockée
## 5. Procédure stockée
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**.
@@ -463,7 +494,7 @@ call create_person_holder('Félicien', 'Hébrard', '1970-10-15');
>[!NOTE]
> 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
@@ -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.
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 crédit sur un autre (celui qui cède)
- Un débit sur un compte (celui qui reçoit)
- Un crédit sur un autre (celui qui cède)
La somme des débits doit toujours être égale à la somme des crédits.