banque
This commit is contained in:
71
banque.md
71
banque.md
@@ -23,7 +23,7 @@ La diffusion de cette application est internationale, vous vous efforcerez d'uti
|
|||||||
|
|
||||||
Pour les entités vous utiliserez le singuler et écrirez le tout en minuscule.
|
Pour les entités vous utiliserez le singuler et écrirez le tout en minuscule.
|
||||||
|
|
||||||
## Le Diagramme Entités Relations (ERD)
|
## Séance 1 : Le Diagramme Entités Relations (ERD)
|
||||||
|
|
||||||
### 1. Les titulaires
|
### 1. Les titulaires
|
||||||
|
|
||||||
@@ -34,7 +34,7 @@ Un clients de la banque est appelé un titulaire. Il peut être une personne phy
|
|||||||
- une personne nommée _Françoise Zanetti_, née le 12 avril 1995.
|
- une personne nommée _Françoise Zanetti_, née le 12 avril 1995.
|
||||||
- une entreprise nommée _Boulangerie de Valorgue_, créée le 19 août 2014, numéro d’immatriculation FR19803269968.
|
- une entreprise nommée _Boulangerie de Valorgue_, créée le 19 août 2014, numéro d’immatriculation FR19803269968.
|
||||||
|
|
||||||
### 1.2 Analyse
|
#### 1.2 Analyse
|
||||||
|
|
||||||
- Quelles informations faut-il conserver pour tous les titulaires ?
|
- Quelles informations faut-il conserver pour tous les titulaires ?
|
||||||
- Quelles informations sont spécifiques à chaque type de titulaire ?
|
- Quelles informations sont spécifiques à chaque type de titulaire ?
|
||||||
@@ -43,7 +43,7 @@ Un clients de la banque est appelé un titulaire. Il peut être une personne phy
|
|||||||
> [!TIP]
|
> [!TIP]
|
||||||
> Indice : on peut utiliser une table abstraite `holder`, puis des tables `person` et `company` qui héritent logiquement de celle-ci.
|
> Indice : on peut utiliser une table abstraite `holder`, puis des tables `person` et `company` qui héritent logiquement de celle-ci.
|
||||||
|
|
||||||
### 1.3 Contraintes à respecter
|
#### 1.3 Contraintes à respecter
|
||||||
|
|
||||||
- Chaque `person` ou `company` doit correspondre à exactement un seul `holder`.
|
- Chaque `person` ou `company` doit correspondre à exactement un seul `holder`.
|
||||||
- La suppression d’un `holder` doit supprimer automatiquement la ligne correspondante dans `person` ou `company`.
|
- La suppression d’un `holder` doit supprimer automatiquement la ligne correspondante dans `person` ou `company`.
|
||||||
@@ -85,7 +85,7 @@ erDiagram
|
|||||||
company |o--|| holder : is
|
company |o--|| holder : is
|
||||||
```
|
```
|
||||||
|
|
||||||
## 2. Les comptes
|
### 2. Les comptes
|
||||||
|
|
||||||
- Chaque titulaire peut détenir un ou plusieurs compte.
|
- Chaque titulaire peut détenir un ou plusieurs compte.
|
||||||
- Un compte bancaire doit pouvoir appartenir à un ou plusieurs titulaires (compte individuel / compte joint).
|
- Un compte bancaire doit pouvoir appartenir à un ou plusieurs titulaires (compte individuel / compte joint).
|
||||||
@@ -201,6 +201,16 @@ erDiagram
|
|||||||
|
|
||||||
### 4. Les transactions
|
### 4. Les transactions
|
||||||
|
|
||||||
|
#### La double écriture comptable
|
||||||
|
|
||||||
|
Jusqu’à présent, les dépôts et retraits modifiaient directement le solde d’un 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)
|
||||||
|
|
||||||
|
La somme des débits doit toujours être égale à la somme des crédits.
|
||||||
|
|
||||||
Chaque opération comporte au moins :
|
Chaque opération comporte au moins :
|
||||||
|
|
||||||
* un **compte concerné** ;
|
* un **compte concerné** ;
|
||||||
@@ -209,14 +219,14 @@ Chaque opération comporte au moins :
|
|||||||
* un **sens** (débit ou crédit).
|
* un **sens** (débit ou crédit).
|
||||||
|
|
||||||
|
|
||||||
## **Méthode 1 : montant relatif (positif/négatif)**
|
#### **Méthode 1 : montant relatif (positif/négatif)**
|
||||||
|
|
||||||
On stocke un seul champ `montant`.
|
On stocke un seul champ `montant`.
|
||||||
|
|
||||||
* **Crédit** → montant positif
|
* **Crédit** → montant positif
|
||||||
* **Débit** → montant négatif
|
* **Débit** → montant négatif
|
||||||
|
|
||||||
### Exemple
|
##### Exemple
|
||||||
|
|
||||||
| id | compte | date | montant |
|
| id | compte | date | montant |
|
||||||
| -- | ------ | ---------- | ------- |
|
| -- | ------ | ---------- | ------- |
|
||||||
@@ -224,49 +234,49 @@ On stocke un seul champ `montant`.
|
|||||||
| 2 | 123 | 2025-11-07 | -50.00 |
|
| 2 | 123 | 2025-11-07 | -50.00 |
|
||||||
|
|
||||||
|
|
||||||
### Avantages
|
##### 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 d’un compte.
|
* Représente naturellement le comportement du solde d’un compte.
|
||||||
|
|
||||||
### Inconvénients
|
##### Inconvénients
|
||||||
|
|
||||||
* Le **signe a une signification métier** implicite → risque d’erreur d’interprétation.
|
* Le **signe a une signification métier** implicite → risque d’erreur d’interpré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, l’une pour le débit, l’autre pour le crédit.
|
Deux colonnes numériques, l’une pour le débit, l’autre pour le crédit.
|
||||||
Une seule des deux contient une valeur non nulle.
|
Une seule des deux contient une valeur non nulle.
|
||||||
|
|
||||||
### Exemple
|
##### Exemple
|
||||||
|
|
||||||
| id | compte | date | debit | credit |
|
| id | compte | date | debit | credit |
|
||||||
| -- | ------ | ---------- | ----- | ------ |
|
| -- | ------ | ---------- | ----- | ------ |
|
||||||
| 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 |
|
||||||
|
|
||||||
### Avantages
|
##### 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 d’incohérence si les deux colonnes contiennent des valeurs remplies par erreur.
|
* Risque d’incohé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 montant est toujours positif.
|
||||||
Le sens est indiqué par une lettre (`D` ou `C`).
|
Le sens est indiqué par une lettre (`D` ou `C`).
|
||||||
|
|
||||||
### Exemple
|
##### Exemple
|
||||||
|
|
||||||
| id | compte | date | montant | sens |
|
| id | compte | date | montant | sens |
|
||||||
| -- | ------ | ---------- | ------- | ---- |
|
| -- | ------ | ---------- | ------- | ---- |
|
||||||
@@ -274,13 +284,13 @@ Le sens est indiqué par une lettre (`D` ou `C`).
|
|||||||
| 2 | 123 | 2025-11-07 | 50.00 | D |
|
| 2 | 123 | 2025-11-07 | 50.00 | D |
|
||||||
|
|
||||||
|
|
||||||
### Avantages
|
##### 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 d’ambiguïté sur le signe numérique.
|
* Pas d’ambiguï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)`
|
||||||
@@ -288,31 +298,31 @@ Le sens est indiqué par une lettre (`D` ou `C`).
|
|||||||
* L’usage de lettres rend le **stockage un peu moins compact** (mais négligeable en pratique).
|
* L’usage de lettres rend le **stockage un peu moins compact** (mais négligeable en pratique).
|
||||||
|
|
||||||
|
|
||||||
## **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).
|
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 |
|
||||||
| -- | ------ | ---------- | ------- | ---- |
|
| -- | ------ | ---------- | ------- | ---- |
|
||||||
| 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 |
|
||||||
|
|
||||||
### Avantages
|
##### 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 d’ambiguïté qu’un signe caché dans le montant.
|
* Moins d’ambiguïté qu’un 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 |
|
||||||
| ------- | ---------------------- | ---------- | ---------------- | -------------------- | --------------- |
|
| ------- | ---------------------- | ---------- | ---------------- | -------------------- | --------------- |
|
||||||
@@ -419,8 +429,7 @@ erDiagram
|
|||||||
|
|
||||||
La banque souhaite désormais que toute personne titulaire d’un 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 d’un 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é.
|
||||||
|
|
||||||
|
### 4. L'intégrité des données
|
||||||
## 4. L'intégrité des données
|
|
||||||
|
|
||||||
Lorsque l’on 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 l’on 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**.
|
||||||
|
|
||||||
@@ -435,7 +444,7 @@ begin;
|
|||||||
commit;
|
commit;
|
||||||
```
|
```
|
||||||
|
|
||||||
## 5. 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,
|
Pour fiabiliser le process et être sûr que l'execution s'effectue toujours dans une transaction,
|
||||||
nous allons encapsuler la création d’un titulaire dans une **procédure stockée**.
|
nous allons encapsuler la création d’un titulaire dans une **procédure stockée**.
|
||||||
@@ -494,7 +503,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.
|
||||||
|
|
||||||
## 6. 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
|
||||||
|
|
||||||
@@ -555,7 +564,7 @@ select sum(unnest(p_shares));
|
|||||||
raise exception 'La somme des parts doit être égale à 1 (%.4f)', somme;
|
raise exception 'La somme des parts doit être égale à 1 (%.4f)', somme;
|
||||||
```
|
```
|
||||||
|
|
||||||
### Exemples d’appel
|
#### Exemples d’appel
|
||||||
|
|
||||||
```sql
|
```sql
|
||||||
call create_account(
|
call create_account(
|
||||||
@@ -583,13 +592,3 @@ Doit refuser la création avec une erreur claire :
|
|||||||
```
|
```
|
||||||
ERROR: La somme des parts (1.1000) doit être égale à 1.0000
|
ERROR: La somme des parts (1.1000) doit être égale à 1.0000
|
||||||
```
|
```
|
||||||
|
|
||||||
## La double écriture comptable
|
|
||||||
|
|
||||||
Jusqu’à présent, les dépôts et retraits modifiaient directement le solde d’un 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)
|
|
||||||
|
|
||||||
La somme des débits doit toujours être égale à la somme des crédits.
|
|
||||||
|
|||||||
Reference in New Issue
Block a user