J'ai une petite question concernant la cohérence de mon raisonnement.
J'ai une table Main contenant :
- un identificateur auto-incrémenté pour faire une clé primaire
- une clé étrangère CategorieId pointant sur la clé primaire de la table Categories
- un champ MessageId devant référencer le contenu des différents messages
Or en fonction de la catégorie, le format du message change, j'ai donc du créer une table par catégorie pour stocker correctement toutes les données...
En toute logique, ces tables auraient du hériter d'une table Messages ayant une clé primaire sur laquelle aurait pointé MessageId. Mais PostGreSQL ne semble pas gérer cela
J'ai donc oublié la table Messages mais gardé le concept, en émulant la contrainte via un trigger
Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32 CREATE FUNCTION main_trigger() RETURNS trigger AS $$ DECLARE req varchar; temprec record; tmpint integer := 0; BEGIN req = 'SELECT * FROM ' || CASE WHEN NEW.CategorieId=106 THEN 'Message_106' WHEN NEW.CategorieId=131 THEN 'Message_131' ELSE 'Message_Default' END || ' WHERE Id=' || NEW.MessageId; -- RAISE NOTICE 'main_trigger request:'; -- RAISE NOTICE '%', req; EXECUTE req INTO temprec; GET DIAGNOSTICS tmpint = ROW_COUNT; IF tmpint=0 THEN RAISE EXCEPTION 'Id % not found for Categorie %', NEW.MessageId, NEW.CategorieId; END IF; RETURN NEW; END; $$ LANGUAGE plpgsql; CREATE TRIGGER insert_or_update_main_trigger BEFORE INSERT OR UPDATE ON Main FOR EACH ROW EXECUTE PROCEDURE main_trigger();
Ma question
Y a-t-il une manière plus élégante et/ou performante de procéder pour arriver au même résultat ?
(un batch quotidien va importer plusieurs millions d'enregistrements et je souhaiterais que cet import n'handicape pas trop la disponibilité des résultats)
par avance
Partager