Aller au contenu principal

Schéma de Base de Données

Vue d'ensemble

Le projet utilise Supabase (PostgreSQL 17) comme base de données principale.

PropriétéValeur
Projet SupabaseStageConnectV1
Régioneu-central-2 (Francfort)
Tables publiques46
Vues4
Vues matérialisées2
Index150+
Version interactive

Pour une version interactive du diagramme ER avec zoom complet :

  • Consulter le fichier SQL source : backend/DATABASES/stageconnect_schema_evolutif_complet.sql
  • Ou utiliser un outil comme DBeaver/PGAdmin pour le diagramme ER complet avec toutes les relations

Diagramme ER

Tables par catégorie

Utilisateurs

TableDescription
usersTable centrale d'authentification (Supabase Auth)
studentsProfils étudiants avec niveau académique, université
academic_staffEnseignants-chercheurs avec matricule, département
company_staffEmployés entreprise avec droits de supervision
adminsAdministrateurs plateforme avec type (superadmin, university_admin)

Institutions

TableDescription
universitiesUniversité avec code, type (public/private/international), config JSONB
schools_facultiesÉcoles/facultés au sein d'une université
departmentsDépartements académiques
academic_cyclesAnnées académiques avec dates de stage
academic_programsProgrammes (L1-L3, M1-M2, ING1-ING5) avec règles métier

Stages & Candidatures

TableDescription
internship_offersOffres de stage publiées par les entreprises
internship_applicationsCandidatures étudiants aux offres
internship_conventionsConventions de stage signées (workflow: PENDING → IN_PROGRESS → COMPLETED)
internship_reportsRapports de stage soumis
internship_tasksTâches de suivi du stage
internship_todosTodo list par convention
internship_commentsCommentaires sur les conventions
internship_inspectionsVisites de stage (contrôle terrain)

Entreprises

TableDescription
companiesEntreprises avec secteur, localisation, vérification
company_staffPersonnel entreprise pouvant superviser des stages

Évaluations

TableDescription
academic_supervisor_evaluationsÉvaluations par l'encadreur académique
internship_supervisor_evaluationsÉvaluations par le superviseur entreprise
defense_evaluationsNotes des membres du jury
student_self_evaluationsAuto-évaluations étudiant

Soutenance

TableDescription
defensesSessions de soutenance avec date, lieu, status
defense_jury_membersComposition du jury
defense_deliberationsDélibérations du jury

Thèmes & Propositions

TableDescription
student_themesThèmes de stage proposés par les étudiants
student_pairsBinômes pour travaux de groupe
proposed_themesThèmes proposés par les entreprises
theme_databaseBase de thèmes validés
supervision_requestsDemandes d'encadrement

Données étudiants

TableDescription
student_documentsDocuments uploadés (CV, lettres)
student_experiencesExpériences professionnelles
student_skillsCompétences techniques
student_certificationsCertifications obtenues
student_qualificationsQualifications académiques
student_projectsProjets académiques
student_social_linksLiens LinkedIn, portfolio

Système & Configuration

TableDescription
notificationsNotifications utilisateurs
bug_reportsSignalements de bugs
subscriptionsAbonnements plateforme
subscription_plansPlans tarifaires
activity_logsJournal d'activité (audit)
system_configurationConfiguration globale
user_notification_preferencesPréférences de notification

Vues (Views)

VueDescription
students_full_infoVue complète des étudiants avec toutes les infos (université, thème, stage en cours)
conventions_with_actorsConventions avec tous les acteurs (étudiant, entreprise, superviseurs)
themes_with_statsThèmes avec statistiques (binôme, partenaire)
platform_adminsVue consolidée pour les administrateurs plateforme

Vues Matérialisées

Vue matérialiséeDescription
university_statisticsStatistiques agrégées par université (étudiants, stages, entreprises partenaires)
program_statisticsStatistiques par programme académique (inscrits, stages, thèmes)

Index

Index primaires

  • Toutes les tables ont une PK id de type uuid

Index sur FK fréquentes

IndexTableColonnes
idx_academic_staff_useracademic_staffuser_id
idx_academic_staff_universityacademic_staffuniversity_id
idx_students_userstudentsuser_id
idx_students_universitystudentsuniversity_id
idx_company_staff_companycompany_staffcompany_id
idx_company_staff_usercompany_staffuser_id
idx_admins_useradminsuser_id
idx_admins_universityadminsuniversity_id
idx_offers_companyinternship_offerscompany_id
idx_applications_offerinternship_applicationsinternship_offer_id
idx_applications_studentinternship_applicationsstudent_id
idx_conventions_studentinternship_conventionsstudent_id
idx_conventions_companyinternship_conventionscompany_id
idx_conventions_universityinternship_conventionsuniversity_id
idx_conventions_academic_supervisorinternship_conventionsacademic_supervisor_id

Index partiels (données actives)

IndexTableCondition
idx_cycles_activeacademic_cyclesis_active = true
idx_programs_activeacademic_programsis_active = true
idx_departments_activedepartmentsis_active = true
idx_academic_staff_availableacademic_staffis_available_for_supervision = true
idx_offers_activeinternship_offersis_active = true
idx_companies_verifiedcompaniesis_verified = true

Index sur status (workflow)

IndexTableColonnes
idx_applications_statusinternship_applicationsstatus
idx_conventions_statusinternship_conventionsstatus
idx_defenses_statusdefensesstatus
idx_inspections_statusinternship_inspectionsstatus
idx_bug_reports_statusbug_reportsstatus

IndexGIN

  • idx_offers_levels : target_levels (tableau)
  • Index sur JSONB (config, career_prospects)

Triggers & Automatisations

Le schéma inclut plusieurs triggers pour automatiser les tâches récurrentes :

TriggerTableFonction
update_*_updated_atToutes les tablesMet à jour updated_at automatiquement
generate_theme_title_hashstudent_themes, theme_databaseGénère le hash SHA-256 du titre (anti-duplicata)
manage_application_counterinternship_applicationsIncrémente/décrémente le compteur de candidatures
manage_supervisor_countinternship_conventionsMet à jour le nombre d'étudiants supervisés
extract_coords_*internship_offers, companies, internship_conventionsExtrait lat/long depuis Google Maps URL
notify_theme_validationstudent_themesCrée une notification quand un thème est validé

Row Level Security (RLS)

Le schéma active RLS sur les tables sensibles :

  • students : accès propre, superviseur académique, admin université, platform admin
  • academic_staff : accès par université
  • companies : accès public pour les offres, restreint pour les données internes
  • internship_conventions : accès par acteur (étudiant, entreprise, université)
  • notifications : accès destinataire uniquement

Conventions de nommage

Tables

  • Pluriel : students, internship_offers
  • snake_case : tout en minuscules avec underscores

Colonnes

  • PK : toujours id (uuid)
  • FK : {table_singulier}_id — ex: user_id, university_id, company_id
  • Timestamps : created_at, updated_at (TIMESTAMP WITH TIME ZONE)
  • Booléens : préfixe is_ — ex: is_active, is_verified, is_current

Contraintes

  • UK : {table}_{colonne}_key — ex: companies_registration_number_key
  • PK : {table}_pkey — ex: students_pkey
  • FK : {table}_{colonne}_fkey — ex: students_user_id_fkey

Règles métier encodées

CHECK constraints

-- academic_programs.degree_level
CHECK (degree_level IN ('licence', 'master', 'doctorat', 'dut', 'bts'))

-- academic_programs.academic_year
CHECK (academic_year IN ('L1', 'L2', 'L3', 'M1', 'M2', 'D1', 'D2', 'D3', 'ING1', 'ING2', 'ING3', 'ING4', 'ING5'))

-- internship_conventions.status
CHECK (status IN ('PENDING', 'IN_PROGRESS', 'COMPLETED', 'CANCELLED', 'VALIDATED'))

-- users.user_type
CHECK (user_type IN ('STUDENT', 'ACADEMIC_STAFF', 'COMPANY_STAFF', 'ADMIN', 'SCHOOL_STAFF'))

Contraintes de programme

Les programmes académiques définissent des règles métier :

  • requires_theme_validation : thème doit être validé
  • requires_academic_supervisor : encadreur académique obligatoire
  • allows_pair_work : travail en binôme autorisé
  • min_internship_duration_months / max_internship_duration_months

Workflow des stages

internship_applications:
pending → reviewed → accepted / rejected
(ou withdrawn)

internship_conventions:
planned → validated → active → completed
(ou cancelled / suspended)

defenses:
scheduled → in_progress → completed
(ou cancelled / postponed)

Workflow des thèmes

student_themes:
pending → auto_approved / auto_rejected

student_pairs:
pending → confirmed / rejected
(ou dissolved)