Documentation Base de donnée - 0x485254/brief-26 GitHub Wiki
📦 Architecture de la base de données EasyGroup
Cette base de données est conçue pour répondre aux besoins de l’application EasyGroup, dont l’objectif est de permettre la création intelligente de groupes d’apprenants à partir de listes partagées, tout en tenant compte de critères variés (âge, expérience, profils, etc.).
🧱 Structure générale
L’architecture repose sur 7 tables relationnelles, cohérentes et normalisées :
user
list
list_share
person
draw
group
group_person
📋 Détail des tables
user
– Utilisateurs
1. Représente les comptes créés sur la plateforme.
Champ | Type | Contraintes |
---|---|---|
id | int |
PK, auto-incrémenté |
varchar(255) |
NOT NULL, UNIQUE | |
first_name | varchar(255) |
- |
last_name | varchar(255) |
- |
password | varchar(255) |
NOT NULL |
cgu_date | date |
Date d’acceptation des CGU |
is_activated | boolean |
NOT NULL |
created_at | datetime(6) |
NOT NULL, défaut: now() |
updated_at | datetime(6) |
NOT NULL, défaut: now() |
role | enum('USER','ADMIN') |
NOT NULL, défaut: 'USER' |
list
– Listes de personnes
2. Chaque utilisateur peut créer plusieurs listes, partageables avec d’autres utilisateurs.
Champ | Type | Contraintes |
---|---|---|
id | int |
PK, auto-incrémenté |
name | varchar(255) |
NOT NULL |
user_id | int |
FK vers user.id , NOT NULL |
is_shared | boolean |
NOT NULL, défaut: false |
🔐 Contrainte : (name, user_id)
doit être unique (nom de liste unique par utilisateur).
list_share
– Partage de listes
3. Permet à un utilisateur de voir une liste créée par un autre.
Champ | Type | Contraintes |
---|---|---|
id | int |
PK, auto-incrémenté |
list_id | int |
FK vers list.id , NOT NULL |
shared_with_user_id | int |
FK vers user.id , NOT NULL |
🔐 Contrainte : (list_id, shared_with_user_id)
est unique (un même utilisateur ne peut pas recevoir plusieurs fois la même liste).
person
– Personnes d'une liste
4. Stocke les caractéristiques de chaque personne d'une liste.
Champ | Type | Contraintes |
---|---|---|
id | int |
PK, auto-incrémenté |
name | varchar(50) |
NOT NULL, longueur 3–50 |
gender | enum('FEMALE','MALE','OTHER') |
NOT NULL |
age | int |
NOT NULL, entre 1 et 99 |
french_level | int |
NOT NULL, de 1 à 4 |
old_dwwm | boolean |
NOT NULL |
tech_level | int |
NOT NULL, de 1 à 4 |
profile | enum('A_LAISE','RESERVE','TIMIDE') |
NOT NULL |
list_id | int |
FK vers list.id , NOT NULL |
draw
– Tirages
5. Un tirage correspond à la création de groupes aléatoires à partir d'une liste.
Champ | Type | Contraintes |
---|---|---|
id | int |
PK, auto-incrémenté |
created_at | datetime(6) |
Timestamp optionnel |
list_id | int |
FK vers list.id , NOT NULL |
title | varchar(255) |
Titre personnalisé |
group
– Groupes
6. Groupes générés à partir d’un draw
.
Champ | Type | Contraintes |
---|---|---|
id | int |
PK, auto-incrémenté |
name | varchar(255) |
Nom du groupe |
draw_id | int |
FK vers draw.id , NOT NULL |
group_person
– Association groupe/personne
7. Table de jointure entre les personnes et les groupes auxquels elles appartiennent.
Champ | Type | Contraintes |
---|---|---|
group_id | int |
FK vers group.id , NOT NULL |
person_id | int |
FK vers person.id , NOT NULL |
🔗 Relations clés
- Un
user
possède plusieurslist
- Une
list
contient plusieursperson
et peut être partagée (vialist_share
) - Une
list
peut avoir plusieursdraw
- Un
draw
génère plusieursgroup
- Un
group
contient plusieursperson
(viagroup_person
)
🛡️ Contraintes d’intégrité
- Clés primaires (
id
) sur toutes les entités. - Contraintes
NOT NULL
pour garantir la complétude des données essentielles. - Contraintes de type
ENUM
pour des champs à choix restreints. - Index et clés uniques (
UNIQUE
) pour éviter les doublons de listes.
🗃️ Bonnes pratiques respectées
- Nommage explicite des tables et colonnes
- Suppression des colonnes calculables (
count
) en faveur de méthodes backend - Typage fort (
enum
,boolean
,datetime
) - Relations bien définies via clés étrangères
- Prise en compte du partage et de l’historique
🧪 Évolutivité
Le schéma est conçu pour :
- Être dockerisable avec MySQL/PostgreSQL
- Intégrer une séparation entre utilisateurs et groupes via les
draw
- Permettre un TDD facile (schéma stable et modulaire)
- S'adapter à des futurs modules : filtres intelligents, versions de tirage, statistiques…
📎 Notes
- Pour éviter les regroupements identiques, l’algorithme de tirage peut se baser sur un historique calculé en back à partir des
group_person
associés à chaquedraw
. - La base n’inclut volontairement aucune donnée sensible inutile : RGPD-friendly.
Exemple de requête SQL JOIN:
SELECT g.name AS group_name, p.name AS person_name FROM group g JOIN group_person gp ON g.id = gp.group_id JOIN person p ON p.id = gp.person_id WHERE g.draw_id = :drawId;
Format de réponse:
[ { "group_name": "Groupe 1", "person_name": "Alice", ... }, { "group_name": "Groupe 1", "person_name": "Bob", ... }, { "group_name": "Groupe 2", "person_name": "Claire", ... } ]