-- ============================================================ -- Omika Diagnostic Center -- 007_diagnostics_usage.sql -- Tâche 18 : télémétrie d'utilisation des écrans / fonctionnalités (additif). -- ============================================================ -- IDEMPOTENT : ADD COLUMN IF NOT EXISTS + CREATE INDEX IF NOT EXISTS. -- AUCUN DROP, AUCUNE suppression, AUCUNE migration destructive. -- PostgreSQL 18 compatible (syntaxe disponible depuis 9.6). -- -- Ajoute au diagnostic_event deux dimensions d'USAGE fonctionnel, NULLABLES : -- les événements antérieurs restent parfaitement valides (screen_code = NULL, -- feature_code = NULL), AUCUN backfill, AUCUNE valeur inventée (« UNKNOWN »/« N/A » -- interdits). -- -- screen_code : code fonctionnel STABLE d'un écran (ex. AGENDA, SITE_DETAIL). -- Produit DEPUIS le catalogue applicatif (jamais un nom de -- Page/ViewModel, jamais un identifiant métier, jamais une saisie -- utilisateur). Null pour les événements background sans écran. -- feature_code: code fonctionnel STABLE d'une action métier significative -- (ex. EMAIL_SEND, REPORT_GENERATE). Attaché à l'événement précis -- de l'action, jamais à un « contexte courant » global. Null si non -- applicable. -- -- CHOIX DE TYPE (cohérence schéma) : TEXT sans VARCHAR, comme les autres chaînes -- (priority, level, component, license_number…). La validation (longueur, valeurs -- bornées) est portée par le code au moment de la résolution, comme les autres -- champs. Les deux colonnes sont NON SENSIBLES : jamais de DeviceId/UserId/ -- CollaborateurId/email/téléphone/token/id métier dynamique (§9/§10/§72). -- ============================================================ ALTER TABLE diagnostic_event ADD COLUMN IF NOT EXISTS screen_code TEXT, ADD COLUMN IF NOT EXISTS feature_code TEXT; -- Index de recherche « tous les ScreenView d'un écran dans le temps » (T18, §49) : -- les agrégations d'usage filtrent par (event_code, screen_code) puis par période, -- mais l'index composé (screen_code, timestamp_utc DESC) couvre le filtre écran + -- le tri temporel des diagnostics filtrés (§60), aligné sur le style de -- ix_diagnostic_event_device_key_timestamp (006). CREATE INDEX IF NOT EXISTS ix_diagnostic_event_screen_code_timestamp ON diagnostic_event (screen_code, timestamp_utc DESC); -- Index (feature_code, timestamp_utc DESC) : filtre fonctionnalité + tri temporel. -- FeatureCode est une dimension de catalogue à cardinalité TRÈS faible (< 10), donc -- un index est peu sélectif ; il est néanmoins ajouté par symétrie avec screen_code -- car le filtre « Tous les diagnostics d'une fonctionnalité » (§60) est prévu. CREATE INDEX IF NOT EXISTS ix_diagnostic_event_feature_code_timestamp ON diagnostic_event (feature_code, timestamp_utc DESC);