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

Langage SQL Discussion :

Clé étrangère et primaire


Sujet :

Langage SQL

  1. #1
    Membre du Club
    Inscrit en
    Juillet 2011
    Messages
    73
    Détails du profil
    Informations forums :
    Inscription : Juillet 2011
    Messages : 73
    Points : 48
    Points
    48
    Par défaut Clé étrangère et primaire
    Bonjour,
    Mon problème ne porte pas vraiment sur le langage SQL mais la logique des bases de données.
    Voilà j'ai deux tables :
    Message (où je stocke les infos de l'email) et Attachement où je stocke les infos sur les pièces jointes de l'email).
    J'ai deux possibilités :
    Code : 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
     
    Create table Message(
    	codeMessage Integer Not Null AUTO_INCREMENT,
    	Objet Varchar(50),
    	Message Text,
    	DateMessage Date Not Null,
    	TimeMessage Time Not Null,
    	Primary Key (codeMessage)
    );
     
    Create Table Attachement (
    	codeAtt Integer Not Null AUTO_INCREMENT,
    	Chemin Varchar(50) Not Null,
    	codeMessage Integer Not Null,
    	Primary Key (codeAtt),
    	Foreign Key (codeMessage) References Message (codeMessage)
    							  on Update Cascade
    							  on Delete Cascade
    );
    Ici, je crée une clé primaire "codeAtt" pour les pièces jointes, mais qui ne veut rien dire sémantiquement, car la même pièce jointe peut être stockée à chaque fois avec une nouvelle clé, chaque fois qu'elle est utilisée.

    Code : 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
     
    Create table Message(
    	codeMessage Integer Not Null AUTO_INCREMENT,
    	Objet Varchar(50),
    	Message Text,
    	DateMessage Date Not Null,
    	TimeMessage Time Not Null,
    	Primary Key (codeMessage)
    );
     
    Create Table Attachement (
     
    	Chemin Varchar(50) Not Null,
    	codeMessage Integer Not Null,
     
    	Foreign Key (codeMessage) References Message (codeMessage)
    							  on Update Cascade
    							  on Delete Cascade,
    	Primary Key (codeMessage)
    );
    Ici, j'utilise codeMessage dans la table Attachement, non seulement comme une clé étrangère mais aussi pour une clé primaire de la table, je trouve ça plus significatif dans la réalité, mais ça ne me permettra d'avoir qu'une seule pièce jointe par message !!

    Où pourrais-je utiliser une autre clé primaire pour la table attachement ??

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 198
    Points : 12 774
    Points
    12 774
    Par défaut
    Bonjour,
    Avec ta deuxième méthode, comment fais-tu pour avoir 2 pièces jointes dans un mail ?

    Tatayo.

  3. #3
    Membre expérimenté
    Homme Profil pro
    Ingenieur de recherche - Ecologue
    Inscrit en
    Juin 2003
    Messages
    1 146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingenieur de recherche - Ecologue

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 146
    Points : 1 412
    Points
    1 412
    Par défaut
    Pourquoi le fait d'avoir une clé primaire qui ne sert jamais te pose des soucis ?


    Clairement la première solution est plus pertinente (dans la réalité on a souvent plusieurs fichiers attachés, non ?)
    Merci d'ajouter un sur les tags qui vous ont aidé

  4. #4
    Membre du Club
    Inscrit en
    Juillet 2011
    Messages
    73
    Détails du profil
    Informations forums :
    Inscription : Juillet 2011
    Messages : 73
    Points : 48
    Points
    48
    Par défaut
    Justement tatayo, c'est pour cette raison que je suis perdue, dans le deuxième exemple, je ne pourrais avoir qu'une seule pièce jointe par message !!

  5. #5
    Membre du Club
    Inscrit en
    Juillet 2011
    Messages
    73
    Détails du profil
    Informations forums :
    Inscription : Juillet 2011
    Messages : 73
    Points : 48
    Points
    48
    Par défaut
    Citation Envoyé par dehorter olivier Voir le message
    Pourquoi le fait d'avoir une clé primaire qui ne sert jamais te pose des soucis ?


    Clairement la première solution est plus pertinente (dans la réalité on a souvent plusieurs fichiers attachés, non ?)
    Et ben si j'utilise le premier exemple, à chaque fois que je veux utiliser la même pièce jointe, elle va être ajoutée avec une nouvelle clé, alors que si tu essayes avec ta boite email, d'envoyer un message, avec 2 fois la même pièce, ça ne marche pas !!

  6. #6
    Membre du Club
    Inscrit en
    Juillet 2011
    Messages
    73
    Détails du profil
    Informations forums :
    Inscription : Juillet 2011
    Messages : 73
    Points : 48
    Points
    48
    Par défaut
    Je crois que j'ai trouvé
    Si la clé primaire de la table Attachement est a la fois codeMessage et Chemin, ca va permettre d'avoir plusieurs pièces jointes par message, et aussi de ne pas choisir la même pièce jointe pour le même message!! voilà

    (parfois quand tu essaye d'expliquer le problème tu le comprend mieux !!)

  7. #7
    Membre du Club
    Inscrit en
    Juillet 2011
    Messages
    73
    Détails du profil
    Informations forums :
    Inscription : Juillet 2011
    Messages : 73
    Points : 48
    Points
    48
    Par défaut
    Voici le nouveaux code
    Code : 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
     
    Create table Message(
    	codeMessage Integer Not Null AUTO_INCREMENT,
    	Objet Varchar(50),
    	Message Text,
    	DateMessage Date Not Null,
    	TimeMessage Time Not Null,
    	Primary Key (codeMessage)
    );
     
    Create Table Attachement (
    	Chemin Varchar(200) Primary Key,
    );
     
    Create Table Att_Message(
    	Chemin Varchar(200) Not Null,
    	codeMessage Integer Not Null,
    	Foreign Key Chemin References Attachement (Chemin)
    					   On Update Cascade
    					   On Delete Cascade,
    	Foreign Key codeMessage References Message (codeMessage)
    							On Update Cascade
    							On Delete Cascade,
    	Primary Key (Chemin, codeMessage)
    );
    Des remarques..??!!

  8. #8
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    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 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par developpCathy Voir le message
    Des remarques..??!!
    Oh oui !
    Un VARCHAR(200) comme clé primaire, c'est contre performant !

    Si je comprends bien ta structure, tu as voulu implémenter l'association suivante :
    message -0,n----joindre----1,n- attachement

    Met un identifiant auto-incrémenté à ton attachement et utilise le dans la clé primaire de la table associative :
    message (msg_id, msg_objet...)
    attachement (att_id, att_chemin)
    att_message (am_id_message, am_id_attachement)

    Au passage, pourquoi séparer la date et l'heure du message au lieu d'utiliser le type DATETIME ?
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    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 !

  9. #9
    Membre du Club
    Inscrit en
    Juillet 2011
    Messages
    73
    Détails du profil
    Informations forums :
    Inscription : Juillet 2011
    Messages : 73
    Points : 48
    Points
    48
    Par défaut
    CinePhil je vous remercie infiniment pour vos précieuses remarques

    Citation Envoyé par CinePhil Voir le message
    Mets un identifiant auto-incrémenté à ton attachement et utilise le dans la clé primaire de la table associative :
    message (msg_id, msg_objet...)
    attachement (att_id, att_chemin)
    att_message (am_id_message, am_id_attachement)
    Pas mal comme idée, mais ça revient à ce que j'ai mentionné au début, un id qui s'auto-incrémente donc à chaque fois que je veux ajouter le même attachement au même message l'id s'incrémente et ça passe, alors que c'est pas là ce que je veux!!
    et si je mets "text" pour le chemin au lieu de varchar(200)..?

  10. #10
    Membre du Club
    Inscrit en
    Juillet 2011
    Messages
    73
    Détails du profil
    Informations forums :
    Inscription : Juillet 2011
    Messages : 73
    Points : 48
    Points
    48
    Par défaut
    Est-ce que je pourrais par exemple ajouter l'id qui s'incrémente, mais pas dans la base, j’incrémenterai à partir de l'application à chaque fois que l'utilisateur choisit un nouveau chemin...??!!

  11. #11
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    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 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par developpCathy Voir le message
    Pas mal comme idée, mais ca reviens à ce que j'ai mentioné au début, un id qui s'auto-incrémente donc à chaque fois que je veux ajouter le même attachement au même message l'id s'incrémente et sa passe, alors que c'est pas la ce que je veux!!
    Là ça ne dépend plus des données mais du processus de ton programme !

    Scénario :
    1) J'envoie un message avec la pièce jointe stockée en /home/philippe/documents/mapomme.jpg.
    2) Le programme interroge la BDD pour savoir si la pièce jointe est déjà référencée.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT att_id
    FROM attachement
    WHERE att_chemin = '/home/philippe/documents/mapomme.jpg'
    3) Si la requête ne retourne pas de résultat, j'ajoute la pièce jointe à la table attachement et je récupère son identifiant créé par auto-incrémentation.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    INSERT INTO attachement (chemin)
    VALUES ('/home/philippe/documents/mapomme.jpg')
    4) Je crée le message et je récupère son identifiant.
    5) J'associe les deux et l'enregistre dans la table associative att_message.

    et si je met "text" pour le chemin au lieu de varchar(200)..?
    Surtout pas ! C'est encore pire pour les performances !
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    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 !

  12. #12
    Membre du Club
    Inscrit en
    Juillet 2011
    Messages
    73
    Détails du profil
    Informations forums :
    Inscription : Juillet 2011
    Messages : 73
    Points : 48
    Points
    48
    Par défaut
    Je vous remercie

    J’attendrais d'autres remarques..!!

  13. #13
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Points : 2 890
    Points
    2 890
    Par défaut
    A quoi sert d'avoir la table attachement avec sa colonne chemin alors que le chemin est déjà dans la table Att_Message?
    Pour interdire d'avoir plusieurs fois le même chemin dans un message, un index unique sur le couple (codemessage,chemin) est suffisant, et au passage, il n'est pas nécessaire que cet index unique soit la clef primaire.
    Il peut très bien y avoir en plus une clef primaire en ID auto-incrémenté, s'il se trouve que cet ID a une utilité.

Discussions similaires

  1. Réponses: 0
    Dernier message: 05/03/2012, 15h18
  2. Réponses: 9
    Dernier message: 27/01/2011, 14h53
  3. Clé primaire, clé étrangère ou simple colonne?
    Par ilyassou dans le forum Décisions SGBD
    Réponses: 3
    Dernier message: 19/11/2005, 10h22
  4. [clé primaire et étrangère]
    Par viny dans le forum Requêtes
    Réponses: 9
    Dernier message: 05/08/2003, 18h23
  5. clé primaire composée de 2 clés étrangères
    Par Tigresse dans le forum Installation
    Réponses: 5
    Dernier message: 28/07/2003, 14h38

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