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

Schéma Discussion :

Probleme de clef etrangere


Sujet :

Schéma

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Dev
    Inscrit en
    Janvier 2012
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Dev
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Janvier 2012
    Messages : 9
    Points : 9
    Points
    9
    Par défaut Probleme de clef etrangere
    Bonjour,

    je vais vous mettre mon diagramme en dessous

    pour explique

    j'ai des cameras qui prennent le nombre de personne entrant et sortant tous les quart d'heure.
    je met ce comptage dans une table comptage ou la clef primaire est constituer du nom du tpv (nom du terminal video unique et de l’heure de la prise de vue (pas de 15 minutes))
    j'ai une table boutique ou il y a un nom de boutique et le tpv la clef etant le codeboutique ( code interne a l'entreprise)


    nommag pk pk heure
    nomtpv fk ---------------- enregistre ---------------- fk pk nomtpv

    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
    -- -----------------------------------------------------
    -- Table `ammagit_ammroot`.`Comptage`
    -- -----------------------------------------------------
    CREATE TABLE IF NOT EXISTS `ammagit_ammroot`.`Comptage` (
      `NomTPV` CHAR(11) NOT NULL,
      `Heure` DATETIME NOT NULL,
      `CameraNum` INT NULL,
      `Entrant` INT NULL,
      `Sortant` INT NULL,
      UNIQUE INDEX `NomTPV_UNIQUE` (`NomTPV` ASC) ,
      UNIQUE INDEX `Heure_UNIQUE` (`Heure` ASC) ,
      PRIMARY KEY (`Heure`, `NomTPV`),
      CONSTRAINT `fk_Comptage_boutiques1`
        FOREIGN KEY (`NomTPV`)
        REFERENCES `ammagit_ammroot`.`boutiques` (`NomTPV`)
        ON DELETE NO ACTION
        ON UPDATE NO ACTION)
    ENGINE = InnoDB;


    mais j'ai une erreur sur la clef etrangere

    alors j'ai pense faire une table intermediaire mais normalement je ne penses pas en avoir besoin.

    puisque je suis en en 1 pour n et non en n pour n.

    je sais pas trop quel est la meilleur solution je vous met les diagrammes dessous.

    merci

    Capt

    Nom : diagram.jpg
Affichages : 349
Taille : 193,6 Ko

  2. #2
    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
    Bonjour,

    Dans une clé étrangère, vous ne pouvez faire référence qu'à une colonne de table munie d'un index UNIQUE, dans l'idéal, une clé primaire.

    Il faut que Comptage référence Boutiques.CodeMag.

    Au passage, une colonne de type CHAR ou VARCHAR est une mauvaise clé primaire ! Voir l'article de SQLPro.
    Au delà de 10 caractères, préférez le VARCHAR au CHAR ; inutile de perdre de la place si la majorité de vos magasins ont un nom inférieur à 50 caractères.
    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 !

  3. #3
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 136
    Points : 38 912
    Points
    38 912
    Billets dans le blog
    9
    Par défaut
    Bonjour,

    @Cinephil, au sujet de la taille critique en deçà ou ou delà de laquelle il est préférable de choisir du char ou du varchar, je serais un peu plus nuancé.

    Plusieurs phénomènes sont à prendre en compte
    - le varchar possède un attribut longueur qui augmente sa taille effective de 1 à 3 octets
    - le varchar peut induire des déplacements dans les pages data et index en cas de changement de longueur à la hausse
    - le varchar nécessite un réalignement par le moteur du SGBD dans les opérations de tri et regroupement (UNION sans "all", DISTINCT, GROUP BY, PARTITION BY, ORDER BY)

    Du coup, selon la fréquence des mises à jour de la donnée, le nombre d'index utilisant la colonne et le type d'opérations effectuées sur celle-ci la taille critique n'est pas la même.
    Plus les modifications sont fréquentes pour une même ligne, plus il y a d'index sur la colonne et plus la taille est réduite, plus le CHAR fixe est performant et inversement.
    Empiriquement, je mettrai plutôt du char fixe jusqu'à 20 ou 25 caractères et du varchar au delà, mais comme disait Maître Capello "n'ergotons point"

  4. #4
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 136
    Points : 38 912
    Points
    38 912
    Billets dans le blog
    9
    Par défaut
    Bonsoir

    Vous pouvez avantageusement utiliser l'identification relative pour :
    - la boutique qui est une entité-type faible de l'entreprise, la PK de la boutique sera donc PK entreprise + chrono (attribué par le SGBD, ici on est visiblement dans MySQL donc une colonne de type "auto_incrément"
    - le comptage qui est une entité-type faible de la boutique, la PK du comptage sera donc la PK de la boutique (soit PK entreprise + chrono boutique) + un chrono spécifique au comptage (également de type "auto_incrément")
    ce faisant, vous répondez également à la juste remarque de Cinéphil au sujet des PK de type char ou varchar

    Le pays ne doit pas être un attribut de la boutique : créez une table des pays (identifiant, code, libellé, date de début et de fin de validité) et créez une table associative entre boutique et pays

    Le fait d'avoir mis l'attribut "nomTPV" comme FK dans la table "boutique" implique qu'il y a un seul TPV par boutique, est-ce bien toujours le cas ?

    Le mot de passe sur 50 caractères, je doute que ce soit très utile peu de personnes vont se faire ch##r à créer un mot de passe aussi long !

    Et pour finir, c'est quoi cette table "CompageMag" ?

  5. #5
    Membre émérite
    Avatar de Paprick
    Homme Profil pro
    Professeur des Universités
    Inscrit en
    Juin 2019
    Messages
    678
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Professeur des Universités
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2019
    Messages : 678
    Points : 2 716
    Points
    2 716
    Par défaut
    Bonsoir,

    Je suis un peu gêné par la représentation du modèle qui semble être un mélange entre un diagramme de classes UML et un schéma relationnel (cf. représentation des clés étrangères)…
    Je pense que,
    avant de s'embarquer dans des considérations techniques, il est essentiel de réaliser le modèle conceptuel de données dans les règles de l'art, soit avec le formalisme entité-association, soit avec un vrai diagramme de classes UML.
    Il est possible que l'outil que vous utilisez le permette ; sinon, il existe bon nombre de logiciels permettant de le faire ; p
    armi ceux que je connais : Win'Design, PowerAMC, JMerise, Looping (et il en existe bien d'autres) => cf. discussion Quel logiciel télécharger pour réaliser un MCD

    Une fois la phase conception parfaitement effectuée, le passage au niveau logique puis physique est automatique, et surtout cela évite les erreurs de correspondances entre clés primaires et étrangères.

    Bon courage !
    Patrick Bergougnoux - Professeur des Universités au Département Informatique de l'IUT de Toulouse III
    La simplicité est la sophistication suprême (Léonard de Vinci)
    LIVRE : Modélisation Conceptuelle de Données - Une Démarche Pragmatique
    Looping - Logiciel de modélisation gratuit et libre d'utilisation

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Dev
    Inscrit en
    Janvier 2012
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Dev
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Janvier 2012
    Messages : 9
    Points : 9
    Points
    9
    Par défaut
    Bonjour,

    c'est le diagrame relationel cree sous workbench de mysql donc aucune ment un diagramme de classe c'est purement de la base de donnee il n'y a aucune classe.

    d'ailleurs ce ne sont que des tables et des colonnes.

    alors oui je n'ai pas fait dans les regles de l'art parceque j'etais presse par le temps mais je sais que c'est une mauvaise excuse..

    je vous remercie tous de vos reponses desole de ne pas voir repondu plus tot mais j'etais un peu degoute.
    on m'a fait developper ce projet pendant le confinement en chômage partiel pour me licencier apres 2 semaines de retrour au travail et le projet termine.

    je vous remercie tous...

    Cordialement

    Citation Envoyé par Paprick Voir le message
    Bonsoir,

    Je suis un peu gêné par la représentation du modèle qui semble être un mélange entre un diagramme de classes UML et un schéma relationnel (cf. représentation des clés étrangères)…
    Je pense que,
    avant de s'embarquer dans des considérations techniques, il est essentiel de réaliser le modèle conceptuel de données dans les règles de l'art, soit avec le formalisme entité-association, soit avec un vrai diagramme de classes UML.
    Il est possible que l'outil que vous utilisez le permette ; sinon, il existe bon nombre de logiciels permettant de le faire ; p
    armi ceux que je connais : Win'Design, PowerAMC, JMerise, Looping (et il en existe bien d'autres) => cf. discussion Quel logiciel télécharger pour réaliser un MCD

    Une fois la phase conception parfaitement effectuée, le passage au niveau logique puis physique est automatique, et surtout cela évite les erreurs de correspondances entre clés primaires et étrangères.

    Bon courage !

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Dev
    Inscrit en
    Janvier 2012
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Dev
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Janvier 2012
    Messages : 9
    Points : 9
    Points
    9
    Par défaut
    Citation Envoyé par escartefigue Voir le message
    Bonsoir

    Vous pouvez avantageusement utiliser l'identification relative pour :
    - la boutique qui est une entité-type faible de l'entreprise, la PK de la boutique sera donc PK entreprise + chrono (attribué par le SGBD, ici on est visiblement dans MySQL donc une colonne de type "auto_incrément"
    - le comptage qui est une entité-type faible de la boutique, la PK du comptage sera donc la PK de la boutique (soit PK entreprise + chrono boutique) + un chrono spécifique au comptage (également de type "auto_incrément")
    ce faisant, vous répondez également à la juste remarque de Cinéphil au sujet des PK de type char ou varchar

    Le pays ne doit pas être un attribut de la boutique : créez une table des pays (identifiant, code, libellé, date de début et de fin de validité) et créez une table associative entre boutique et pays

    Le fait d'avoir mis l'attribut "nomTPV" comme FK dans la table "boutique" implique qu'il y a un seul TPV par boutique, est-ce bien toujours le cas ?

    Le mot de passe sur 50 caractères, je doute que ce soit très utile peu de personnes vont se faire ch##r à créer un mot de passe aussi long !

    Et pour finir, c'est quoi cette table "CompageMag" ?

    merci pour votre reponse elle est tres interessante

    oui il n'y a qu'un seul tpv par boutique,
    pour ce qui est du pays ne serais ca ps surcahrge la base de cree uen table juste pour le pays ??
    puisque seul son nom nous interesse ensuite.

    pour la taille des variables je les toutes mise a l'echelle a la fin, j'etais au moment de la creation et j'ai donc suivi votre conseil et ai mis char (20) et ai remplacer tous les varchar par des CHAR()

    je vous remercie vraiment de votre aide sur la creation des clefs etrangeres

    sinon la table comptage mag est pour lier un comptage a un magasin par desclef qui ne sont pas CHAR
    puisque normalement les clefs doivent etre du int. enfin c'est ce qu'on m'a toujours dit mais je vous avoue que cette talbe me derange et c'est d'ailleurs le fond de ma question.

    est ce que je peux m'en passer plutot faire un lien comme le 1 sans la table comptamag (mauvaise orthographe).

    Cdt

    Cedric

  8. #8
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 136
    Points : 38 912
    Points
    38 912
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par Captain_Flemme Voir le message
    pour ce qui est du pays ne serais ca ps surcahrge la base de cree uen table juste pour le pays ?? puisque seul son nom nous interesse ensuite.
    L'un des principes d'une base de données est de garantir l'intégrité des informations.
    Si le nom du pays est un attribut de la boutique, alors, l'utilisateur sera contraint de saisir le nom du pays en toutes lettres ce qui est un peu fastidieux et rien n'empêchera d'avoir des orthographes différentes pour un même pays. Par exemple "Grande Bretagne", "Grande-Bretagne", "Gde Bretagne", "Angleterre" etc.
    Si une table des pays est créée, vous pourrez la charger à partir de tout ou partie de la liste officielle des pays (ISO3166, disponible gratuitement sur internet).
    L'avantage est que vous aurez une liste fiable, une orthographe unique et que l'application pourra présenter une pop up dans laquelle l'utilisateur pourra sélectionner le pays sans avoir à le saisir
    Autre avantage, à la marge, il arrive que des pays changent de nom (par exemple la Haute Volta devenue Burkina Faso).
    Il est plus facile et plus fiable en ce cas de n'avoir qu'une ligne à modifier dans la table des pays plutôt que de le faire pour chaque occurrence concernée dans la table des boutiques.


    Citation Envoyé par Captain_Flemme Voir le message
    sinon la table comptage mag est pour lier un comptage a un magasin par desclef qui ne sont pas CHAR
    puisque normalement les clefs doivent etre du int. enfin c'est ce qu'on m'a toujours dit mais je vous avoue que cette talbe me derange et c'est d'ailleurs le fond de ma question.
    est ce que je peux m'en passer plutot faire un lien comme le 1 sans la table comptamag (mauvaise orthographe).
    Désolé mais je n'ai pas compris le besoin ni la question

Discussions similaires

  1. probleme pour introduire une clef etrangere
    Par zyriuse dans le forum SQL Procédural
    Réponses: 6
    Dernier message: 01/12/2007, 22h50
  2. Problème de clefs étrangères
    Par rieppe dans le forum SQL Procédural
    Réponses: 7
    Dernier message: 26/07/2006, 09h36
  3. probleme de clé etrangere
    Par donny dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 19/05/2005, 08h46
  4. clefs etrangeres en mysql
    Par loveflower dans le forum Décisions SGBD
    Réponses: 1
    Dernier message: 10/11/2004, 19h48
  5. Modification de clefs etrangeres impossible
    Par mboitet dans le forum SQL
    Réponses: 1
    Dernier message: 19/08/2004, 17h11

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