-- ═══════════════════════════════════════════════════════════════════════════ -- Listes de surveillance d'aéronefs -- -- Deux tables plutôt qu'une colonne « liste » libre : une liste est un objet -- qu'on renomme, colore et supprime, et sa suppression doit emporter ses -- membres. Une chaîne répétée sur chaque ligne rendrait le renommage fragile. -- -- La clé de surveillance est l'adresse ICAO 24 bits, stable pour une cellule -- donnée, et non l'indicatif, qui change à chaque vol et manque souvent. -- -- À jouer avec ON_ERROR_STOP=1. -- ═══════════════════════════════════════════════════════════════════════════ BEGIN; CREATE TABLE IF NOT EXISTS adsb.watchlists ( id serial PRIMARY KEY, nom varchar(60) NOT NULL UNIQUE, couleur varchar(9) NOT NULL DEFAULT '#d29922', description text, actif boolean NOT NULL DEFAULT true, created_at timestamptz NOT NULL DEFAULT now() ); COMMENT ON TABLE adsb.watchlists IS 'Listes de surveillance nommées (ex. Militaires, Hélicoptères).'; CREATE TABLE IF NOT EXISTS adsb.watchlist_items ( id serial PRIMARY KEY, watchlist_id integer NOT NULL REFERENCES adsb.watchlists(id) ON DELETE CASCADE, icao varchar(6) NOT NULL, motif text, -- Instantané des métadonnées au moment de la mise sous surveillance. -- Redondant avec aircraft_history, et c'est voulu : il garde une trace de -- ce qui avait motivé l'ajout, même si la fiche de l'appareil change -- ensuite, et évite une jointure à chaque affichage de la liste. callsign varchar(12), aircraft_type varchar(8), aircraft_desc varchar(60), aircraft_wtc varchar(4), operator_name varchar(120), country varchar(60), added_at timestamptz NOT NULL DEFAULT now(), CONSTRAINT watchlist_items_uniq UNIQUE (watchlist_id, icao), -- Normalisation imposée en base : l'API majuscule déjà, mais une insertion -- manuelle en minuscules créerait un doublon invisible. CONSTRAINT watchlist_items_icao_upper CHECK (icao = upper(icao)) ); -- Recherche « cet appareil est-il surveillé ? » lors du rendu des tableaux CREATE INDEX IF NOT EXISTS watchlist_items_icao_idx ON adsb.watchlist_items (icao); COMMENT ON TABLE adsb.watchlist_items IS 'Aéronefs surveillés, identifiés par leur adresse ICAO 24 bits.'; -- Liste par défaut, pour que le bouton « Surveiller » ait une cible dès le -- premier clic sans imposer la création préalable d'une liste. INSERT INTO adsb.watchlists (nom, couleur, description) SELECT 'Surveillance', '#d29922', 'Liste par défaut' WHERE NOT EXISTS (SELECT 1 FROM adsb.watchlists); COMMIT; \echo '--- Tables créées ---' SELECT w.id, w.nom, w.couleur, w.actif, count(i.id) AS appareils FROM adsb.watchlists w LEFT JOIN adsb.watchlist_items i ON i.watchlist_id = w.id GROUP BY w.id, w.nom, w.couleur, w.actif ORDER BY w.id;