diff --git a/banque.md b/banque.md index 91ec8ca..0330b3d 100644 --- a/banque.md +++ b/banque.md @@ -49,9 +49,6 @@ Un clients de la banque est appelé un titulaire. Il peut être une personne phy - La suppression d’un `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 @@ -140,7 +179,7 @@ erDiagram bigint holder_id FK decimal share } - + operation { bigint id PK bigint transaction_id FK @@ -154,17 +193,14 @@ erDiagram person |o--|| holder : is company |o--|| holder : is bank |o--|| holder : is - holder }|--|{ account_holder : a + holder }|--|{ account_holder : a account_holder }|--|{ account : hold - operation }o--|| account : concerne - operation }o--|| account : concerne + operation }o--|| account : concerne + 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 d’un compte. -### ❌ Inconvénients +### Inconvénients * 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. * 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, l’une pour le débit, l’autre 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, l’une pour le débit, l’autre 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 d’incohé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 d’ambiguï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 d’ambiguïté qu’un 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 @@ -339,7 +361,7 @@ erDiagram bigint holder_id FK decimal share } - + currency { text code PK } @@ -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 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é. -## 3. 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**. @@ -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 d’un 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 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) +- 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.