Projet académique de modélisation et d’implémentation d’une base de données pour la prise de commande en restauration.
- Modèle EA → relationnel (schémas dans
screenshots/
) - SQLite : 8 tables, contraintes, trigger de calcul de prix, données d’exemple, 15 requêtes
- MongoDB : migration par exports JSON, pipeline d’agrégation & Map‑Reduce
- Résultat de l’évaluation : 5.5 / 6 (HEPIA, Genève)
Ce repo montre une démarche from‑scratch : modélisation → SQL → NoSQL avec scripts reproductibles.
- Aperçu rapide
- Prérequis
- Démarrage – SQLite
- Démarrage – MongoDB
- Structure du dépôt
- Points techniques clés
- Captures
- Licence & contact
-
Domaine : restaurants, menus, articles, commandes, employés, clients
-
Règles :
- Composition Menu–Article via table associative
MENU_ARTICLE
avec attributquantite (≥ 1)
- Prix du menu calculé automatiquement (trigger après insert/update/delete sur
MENU_ARTICLE
) - Intégrité référentielle activée et cascades sur tables d’association
- Composition Menu–Article via table associative
-
MongoDB : collections isomorphes aux tables, pipeline
$lookup
+$group
(CA par restaurant) et MapReduce (quantités par article)
- SQLite 3 (CLI) – disponible via Homebrew, APT, choco, etc.
- MongoDB 6+ (serveur +
mongoimport
+ shellmongo
oumongosh
) - Bash (pour exécuter les scripts dans
scripts/
sous macOS/Linux)
Pour Windows : exécuter les commandes dans Git Bash/WSL ou adapter manuellement.
./scripts/run_sqlite.sh
Ce script :
- crée
restaurant.db
à partir derestaurant.sql
; - vérifie la présence des tables et du trigger
maj_prix_menu
; - contrôle le chargement des données d’exemple.
Exemple de requête :
-- articles plus chers que la moyenne
SELECT libelle, prix_unitaire
FROM ARTICLE
WHERE prix_unitaire > (SELECT AVG(prix_unitaire) FROM ARTICLE);
CI GitHub : un workflow (.github/workflows/sqlite-test.yml
) reconstruit la DB et effectue des sanity‑checks lors du push.
Importer toutes les collections JSON :
./scripts/import_mongo.sh
mongo
use resto
Pipeline d’agrégation (CA par restaurant) : mongo/mongo_pipeline.js
Map‑Reduce (quantités vendues par article) : mongo/mapreduce_articles.js
Les fichiers JSON proviennent d’un export des tables SQLite.
.
├── restaurant.sql # schéma + données + trigger
├── json_mongo/ # exports JSON (8 collections)
├── mongo/
│ ├── mongo_pipeline.js # $lookup + $group (CA par restaurant)
│ └── mapreduce_articles.js # map/reduce -> totaux_articles
├── scripts/
│ ├── run_sqlite.sh # build + sanity checks
│ └── import_mongo.sh # mongoimport en boucle
├── screenshots/
│ ├── EA_restaurant.png # diagramme EA
│ └── MR_restaurant.png # schéma relationnel
└── .github/
└── workflows/
└── sqlite-test.yml # petite CI
- Intégrité :
PRAGMA foreign_keys = ON
; FK sur tables d’association enON DELETE CASCADE
- Contraintes :
CLIENT.email UNIQUE
,MENU_ARTICLE.quantite CHECK (>=1)
- Trigger :
maj_prix_menu
recalculeMENU.prix_base
à chaque changement de composition - Limites assumées : pas de gestion de stock, d’historique de prix, ni multi‑adresses ; identifiants numériques conservés en MongoDB pour la traçabilité
Si ce projet vous intéresse : tous les retours sont appréciés.