Établissement : EFREI Module : Base de données répartie Étudiant : Issa KANE Encadrant : Marwa HARZI Année universitaire : 2025-2026 Date de dépôt : 05 avril 2026
PharmaDistrib est un projet de base de données répartie conçu pour une entreprise de santé privée opérant sur deux villes : Casablanca (S1) et Rabat (S2). Chaque site regroupe une clinique, une pharmacie partenaire, du personnel médical, des patients, un stock de médicaments, des consultations et des ventes.
L'objectif est de permettre à chaque site de traiter ses opérations quotidiennes localement, tout en offrant une vision consolidée du réseau à l'échelle globale.
URL de production : https://pharmadistrib-ui.vercel.app
L'interface permet de :
- vérifier l'état des connexions aux trois bases logiques ;
- explorer toutes les relations locales et les vues globales ;
- exécuter les dix requêtes imposées avec leurs paramètres ;
- lancer des requêtes SQL personnalisées en lecture seule.
La console SQL est volontairement limitée aux commandes SELECT, WITH, SHOW et EXPLAIN. Toute requête d'écriture est refusée.
| Identifiant | Base PostgreSQL | Rôle |
|---|---|---|
| S1 | pharmadistrib_s1 |
Site de Casablanca |
| S2 | pharmadistrib_s2 |
Site de Rabat |
| Global | pharmadistrib_global |
Schéma global logique (documentaire) |
- Fragmentation horizontale par ville pour les données opérationnelles (patients, médecins, consultations, prescriptions, ventes, stocks).
- Catalogue médicaments répliqué localement sur S1 et S2 (
medicament_ref). - Accès distant via l'extension
postgres_fdw: chaque site expose des foreign tables vers l'autre site. - Vues globales reconstruites par
UNION ALLdans le schémapharma_repartie. - Intégrité référentielle distribuée assurée par des triggers de vérification (PostgreSQL ne supporte pas nativement les FK inter-sites).
Patient · Medecin · Medicament
Consultation · Prescription · LignePrescription
Stock · Vente · LigneVente
pharmadistrib/
├── 01_schema_global.sql Schéma global logique (référence)
├── 02_fragmentation_s1.sql Fragmentation, FDW, vues globales — site S1
├── 03_fragmentation_s2.sql Fragmentation, FDW, vues globales — site S2
├── 04_donnees_s1.sql Jeu de données site Casablanca
├── 05_donnees_s2.sql Jeu de données site Rabat
├── 06_requetes.sql Dix requêtes réparties imposées
├── 06_requetes_execution_s1.txt Résultats d'exécution vérifiés sur S1
├── rapport_bdr.md Rapport complet du projet
├── server.js Serveur Node.js / Express (API + fichiers statiques)
├── vercel.json Configuration de déploiement Vercel
├── package.json
└── public/
├── index.html Interface web
├── styles.css
└── app.js
Les scripts doivent être exécutés dans l'ordre suivant, en se connectant à la bonne base à chaque étape.
-- Se connecter à pharmadistrib_global
\i 01_schema_global.sql-- Se connecter à pharmadistrib_s1
\i 02_fragmentation_s1.sql
-- Se connecter à pharmadistrib_s2
\i 03_fragmentation_s2.sqlLes scripts 02 et 03 créent l'extension
postgres_fdw, lesFOREIGN SERVER, lesUSER MAPPING, les fragments locaux, les foreign tables et les vues globales.
-- Se connecter à pharmadistrib_s1
\i 04_donnees_s1.sql
-- Se connecter à pharmadistrib_s2
\i 05_donnees_s2.sql-- Se connecter à pharmadistrib_s1 (ou S2 selon la requête)
\i 06_requetes.sql| N° | Objectif | Type |
|---|---|---|
| 1 | Patients de Casablanca | Locale (S1) |
| 2 | Médicaments au prix unitaire maximal | Locale (catalogue répliqué) |
| 3 | Consultations d'un patient donné avec nom du médecin | Répartie |
| 4 | Médicaments prescrits pour une consultation donnée | Répartie |
| 5 | Chiffre d'affaires par ville | Répartie |
| 6 | Médicament le plus vendu sur le réseau | Répartie |
| 7 | Stocks sous le seuil d'alerte | Répartie |
| 8 | Nombre de consultations par médecin | Répartie |
| 9 | Patients ayant consulté dans une ville et acheté dans l'autre | Répartie |
| 10 | Patients ayant acheté un médicament figurant dans leur prescription | Répartie |
Après exécution des scripts, les résultats suivants doivent être obtenus :
| Indicateur | Valeur attendue |
|---|---|
| Patients réseau | 12 (6 Casablanca + 6 Rabat) |
| Consultations | 12 |
| Ventes | 15 |
| CA Casablanca | 324,00 |
| CA Rabat | 409,00 |
| Médicament le plus vendu | Paracétamol — 11 unités |
| Stocks en alerte | Métformine (Casa), Énoxaparine (Casa), Ventoline (Rabat) |
| Patients transvilles (req. 9) | Patients 1003 et 2002 |
| Lignes prescription/vente conformes (req. 10) | 12 lignes |
Prérequis : Node.js 22, accès aux bases PostgreSQL.
npm install
npm start
# Interface disponible sur http://localhost:3010Variables d'environnement requises dans .env.local :
DATABASE_URL_S1=postgresql://user:password@host/pharmadistrib_s1
DATABASE_URL_S2=postgresql://user:password@host/pharmadistrib_s2
DATABASE_URL_GLOBAL=postgresql://user:password@host/pharmadistrib_global
Le rapport complet est disponible dans le fichier rapport_bdr.md. Il couvre :
- présentation du besoin et justification de l'architecture répartie ;
- quatre propositions de fragmentation (2 horizontales, 2 verticales) ;
- stratégie d'allocation retenue ;
- description de l'implémentation PostgreSQL ;
- présentation du jeu de données ;
- interprétation des dix requêtes ;
- analyse critique de la solution.