diff --git a/migrations/02_indexes.sql b/migrations/02_indexes.sql new file mode 100644 index 0000000..bd912c4 --- /dev/null +++ b/migrations/02_indexes.sql @@ -0,0 +1,157 @@ +-- ============================================= +-- 02_indexes.sql : Index FK + colonnes critiques +-- ============================================= + +-- Recommandation : exécuter après 01_init.sql + +-- =========== +-- UTILISATEURS +-- =========== +-- Recherche par email (insensibilité à la casse pour lookup) +CREATE INDEX IF NOT EXISTS idx_utilisateurs_lower_courriel + ON utilisateurs (LOWER(courriel)); + +-- =========== +-- ASSISTANTES_MATERNELLES +-- =========== +-- FK -> utilisateurs(id) +CREATE INDEX IF NOT EXISTS idx_am_id_utilisateur + ON assistantes_maternelles (id_utilisateur); + +-- ======= +-- PARENTS +-- ======= +-- FK -> utilisateurs(id) +CREATE INDEX IF NOT EXISTS idx_parents_id_utilisateur + ON parents (id_utilisateur); + +-- Co-parent (nullable) +CREATE INDEX IF NOT EXISTS idx_parents_id_co_parent + ON parents (id_co_parent); + +-- ======= +-- ENFANTS +-- ======= +-- (souvent filtrés par statut / date_naissance ? à activer si besoin) +-- CREATE INDEX IF NOT EXISTS idx_enfants_statut ON enfants (statut); +-- CREATE INDEX IF NOT EXISTS idx_enfants_date_naissance ON enfants (date_naissance); + +-- ================ +-- ENFANTS_PARENTS (N:N) +-- ================ +-- PK composite déjà en place (id_parent, id_enfant), ajouter index individuels si jointures unilatérales fréquentes +CREATE INDEX IF NOT EXISTS idx_enfants_parents_id_parent + ON enfants_parents (id_parent); + +CREATE INDEX IF NOT EXISTS idx_enfants_parents_id_enfant + ON enfants_parents (id_enfant); + +-- ======== +-- DOSSIERS +-- ======== +-- FK -> parent / enfant +CREATE INDEX IF NOT EXISTS idx_dossiers_id_parent + ON dossiers (id_parent); + +CREATE INDEX IF NOT EXISTS idx_dossiers_id_enfant + ON dossiers (id_enfant); + +-- Statut (filtrages "à traiter", "envoyé", etc.) +CREATE INDEX IF NOT EXISTS idx_dossiers_statut + ON dossiers (statut); + +-- JSONB : si on fait des requêtes @> sur le planning souhaité +-- CREATE INDEX IF NOT EXISTS idx_dossiers_planning_souhaite_gin +-- ON dossiers USING GIN (planning_souhaite); + +-- ======== +-- MESSAGES +-- ======== +-- Filtrage par dossier + tri chronologique +CREATE INDEX IF NOT EXISTS idx_messages_id_dossier_cree_le + ON messages (id_dossier, cree_le); + +-- Recherche par expéditeur +CREATE INDEX IF NOT EXISTS idx_messages_id_expediteur_cree_le + ON messages (id_expediteur, cree_le); + +-- ========= +-- CONTRATS +-- ========= +-- UNIQUE(id_dossier) existe déjà -> index implicite +-- Tri / filtres fréquents +CREATE INDEX IF NOT EXISTS idx_contrats_statut + ON contrats (statut); + +-- JSONB planning : activer si on requête par clé +-- CREATE INDEX IF NOT EXISTS idx_contrats_planning_gin +-- ON contrats USING GIN (planning); + +-- ================== +-- AVENANTS_CONTRATS +-- ================== +CREATE INDEX IF NOT EXISTS idx_avenants_contrats_id_contrat_cree_le + ON avenants_contrats (id_contrat, cree_le); + +CREATE INDEX IF NOT EXISTS idx_avenants_contrats_initie_par + ON avenants_contrats (initie_par); + +CREATE INDEX IF NOT EXISTS idx_avenants_contrats_statut + ON avenants_contrats (statut); + +-- ========= +-- EVENEMENTS +-- ========= +-- Accès par enfant + période +CREATE INDEX IF NOT EXISTS idx_evenements_id_enfant_date_debut + ON evenements (id_enfant, date_debut); + +-- Filtrage par auteur / AM / parent +CREATE INDEX IF NOT EXISTS idx_evenements_cree_par + ON evenements (cree_par); + +CREATE INDEX IF NOT EXISTS idx_evenements_id_am + ON evenements (id_am); + +CREATE INDEX IF NOT EXISTS idx_evenements_id_parent + ON evenements (id_parent); + +CREATE INDEX IF NOT EXISTS idx_evenements_type + ON evenements (type); + +CREATE INDEX IF NOT EXISTS idx_evenements_statut + ON evenements (statut); + +-- ================= +-- SIGNALEMENTS_BUGS +-- ================= +CREATE INDEX IF NOT EXISTS idx_signalements_bugs_id_utilisateur_cree_le + ON signalements_bugs (id_utilisateur, cree_le); + +-- ======= +-- UPLOADS +-- ======= +CREATE INDEX IF NOT EXISTS idx_uploads_id_utilisateur_cree_le + ON uploads (id_utilisateur, cree_le); + +-- ============= +-- NOTIFICATIONS +-- ============= +-- Requêtes fréquentes : non lues + ordre chrono +CREATE INDEX IF NOT EXISTS idx_notifications_user_lu_cree_le + ON notifications (id_utilisateur, lu, cree_le); + +-- Option : index partiel pour "non lues" +-- CREATE INDEX IF NOT EXISTS idx_notifications_non_lues +-- ON notifications (id_utilisateur, cree_le) +-- WHERE lu = false; + +-- =========== +-- VALIDATIONS +-- =========== +-- Requêtes par utilisateur validé, par statut et par date +CREATE INDEX IF NOT EXISTS idx_validations_id_utilisateur_cree_le + ON validations (id_utilisateur, cree_le); + +CREATE INDEX IF NOT EXISTS idx_validations_statut + ON validations (statut);