adsb-1090/watchlist_schema.sql

72 lines
3.2 KiB
PL/PgSQL

-- ═══════════════════════════════════════════════════════════════════════════
-- 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;