Précédent   Forum des professionnels en informatique > Bases de données > MySQL > SQL Procédural
SQL Procédural Forum d'entraide sur les triggers, les procédures stockées et les fonctions en MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 24/12/2010, 09h57   #1
Nouveau Membre du Club
 
Inscription : février 2010
Messages : 117
Détails du profil
Informations forums :
Inscription : février 2010
Messages : 117
Points : 33
Points : 33
Par défaut Foreign key et triggers.

Bonjour,

Nous travaillons sur des bases utilisant un modèle en étoile et nous abusons donc de foreign key pour maintenir l’intégrité ce celui-ci.
Toutefois force est de constater que certaines clef étrangères nous posent problème , par exemple :
Mettons une table d'action et une table d'activité
Code :
1
2
3
4
5
6
7
8
9
10
11
12
CREATE TABLE actions(id INT UNSIGNED PRIMARY KEY  AUTO_INCREMENT,
id_contact INT UNSIGNED,
action_time DATETIME,
id_activite INT UNSIGNED,
 
FOREIGN KEY (id_activite) reference activites(id),
FOREIGN KEY (id_contact) reference contacts(id),
UNIQUE(id_contact,id_activite, action_time));
 
CREATE TABLE activites(id INT UNSIGNED PRIMARY KEY ,
nom TEXT,
 ...);
La table d'action est remplie par nos soins, la table d'activités est quand )à elle remplie à l'aide des informations que nous fournit notre client
Notre historique d'action remonte trop loin dans le temps et nous ne possédons pas un historique aussi avancé des activités pour ce client, ainsi nous avons été "contraint" de mettre en place le trigger suivant :
Code :
1
2
3
4
5
6
7
8
CREATE TRIGGER  maj_activite BEFORE INSERT ON actions    
FOR EACH ROW
BEGIN
IF NOT EXISTS (SELECT * FROM activites WHERE NEW.id_activite = activites.id)
AND NEW.id_activite/NEW.id_activite IS NOT NULL
THEN INSERT INTO activites VALUES (NEW.id_activites, ...)
END IF;
END
Dorénavant , quelque soit l'actions qu'on tente d’insérer dans la table d'actions, si il ne trouve pas d'activité reférente , il la créera avant d’insérer le tuple dans la table d'actions ..
J'ai vraiment l'impression qu'on perds l’intérêt de la clef étrangère en faisant ça ..

Qu'en pensez vous ?

Merci d'avance pour tous vos conseils !
ithurts est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/12/2010, 10h22   #2
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 10 980
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 10 980
Points : 18 224
Points : 18 224
Envoyer un message via MSN à CinePhil
Citation:
Envoyé par ithurts Voir le message
La table d'action est remplie par nos soins, la table d'activités est quand )à elle remplie à l'aide des informations que nous fournit notre client
Notre historique d'action remonte trop loin dans le temps et nous ne possédons pas un historique aussi avancé des activités pour ce client,
Tu veux dire que le client envoie des actions passées qui se réfèrent à des activités plus anciennes que celles présentes dans la table "activités" ?

Citation:
Dorénavant , quelque soit l'actions qu'on tente d’insérer dans la table d'actions, si il ne trouve pas d'activité référente , il la créera avant d’insérer le tuple dans la table d'actions ..
J'ai vraiment l'impression qu'on perds l’intérêt de la clef étrangère en faisant ça ..
Tel qu'est fait le trigger, effectivement, ça contourne la contrainte référentielle de la clé étrangère.
Y a t-il, dans la table "activités" une date qui pourrait être comparée à celle de l'action ?
Le trigger pourrait ainsi se limiter à la création des activités pour des actions anciennes et laisser faire l'insertion d'actions nouvelles ou récentes qui devraient logiquement avoir déjà une activité référence en BDD, laissant ainsi la clé étrangère faire son boulot correctement pour ces dernières.
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/12/2010, 11h03   #3
Nouveau Membre du Club
 
Inscription : février 2010
Messages : 117
Détails du profil
Informations forums :
Inscription : février 2010
Messages : 117
Points : 33
Points : 33
Bonjour cinephil,
Malgré mon explication complètement foireuse tu as parfaitement cerné le problème !
Encore et toujours merci pour tes conseils avisés, j'avais pensé à remplir à la main la table des activités avec celles un peu trop vieille, mais conditionner le trigger pour qu'il n'intervienne que sur les activités non récente est encore plus astucieux !

Merci encore et joyeux noël !

Cdt
ithurts est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 11h09.


 
 
 
 
Partenaires

Hébergement Web