IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SQL Procédural MySQL Discussion :

Foreign key et triggers.


Sujet :

SQL Procédural MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    117
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 117
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 !

  2. #2
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 815
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    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 : 16 815
    Billets dans le blog
    14
    Par défaut
    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" ?

    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 Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « 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 la suite Linux Mageïa !

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    117
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 117
    Par défaut
    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

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 0
    Dernier message: 30/07/2014, 14h35
  2. Gestion Foreign Key - Trigger
    Par mulot49 dans le forum SQLite
    Réponses: 2
    Dernier message: 15/06/2007, 15h05
  3. [SQLITE] générateur de Foreign Key Triggers
    Par Yorglaa dans le forum Autres SGBD
    Réponses: 2
    Dernier message: 07/05/2007, 13h43
  4. Trigger vs Foreign Key
    Par boubou11 dans le forum Décisions SGBD
    Réponses: 4
    Dernier message: 21/03/2005, 07h55
  5. [FOREIGN KEY] ou trigger ?
    Par kase74 dans le forum Débuter
    Réponses: 2
    Dernier message: 08/03/2004, 11h54

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo