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

PHP & Base de données Discussion :

entre index et primary, base de relation de tables


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2020
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2020
    Messages : 2
    Par défaut entre index et primary, base de relation de tables
    Bonjour à vous

    Devant rendre un devoir sur PHPmyadmin (en Inno_db), je me permets de faire appel à votre communauté.
    En pièce jointe vous pouvez voir la structure de ma table principale dans laquelle j'ai créé un index et 2 FK.
    J'ai donc 2 autres tables que je compte relier avec ces FK.
    Plusieurs questions :
    - Ces FK doivent être indiquées par l'attribut UNSIGNED ?
    - Dois-je sélectionner pour la catégorie Index : UNIQUE; PRIMARY, INDEX ?
    - L'AI est activée pour la clé index ID_agexe, est-ce bon ?

    Ce sont quelques petites questions de bases qui montrent bien mon niveau... Profane.
    De plus, comment remplir lors de l'insertion des données ? Quels chiffres, dans les colonnes des FK et index, faut-il indiquer pour chaque individu que je souhaite ajouter à ma table ?

    Je bloque souvent sur ce genre de détails et ai écumé, un peu, les sites de création de table et autre PHPmyadmin forum. Je ne comprends toujours pas. J'ai essayé différentes techniques comme la création de relation dans le concepteur mais ça ne marche pas. Je croyais que l'autoincrémentation me permettait de ne rien ajouter lors de l'insertion des données mais ça ne semble pas fonctionner. Aurais-je oublié quelque chose de simple mais fondamental ?

    Je vous remercie par avance et demande ardemment votre soutien.

    Bien cordialement

    Camtar
    Images attachées Images attachées  

  2. #2
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    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 814
    Billets dans le blog
    14
    Par défaut
    Ces FK doivent être indiquées par l'attribut UNSIGNED ?
    Les colonnes soumises à contrainte de clé étrangère doivent être du même type que la colonne qu'elles référencent.

    Par exemple, si la table de référence contient une colonne de type SMALLINT, alors la clé étrangère qui référence cette colonne doit aussi être de type SMALLINT.
    Dois-je sélectionner pour la catégorie Index : UNIQUE; PRIMARY, INDEX ?
    PRIMARY est pour la clé primaire. Vous en avez déjà une dans votre table, vous ne pouvez pas en avoir une autre.
    UNIQUE est une contrainte d'unicité qui, pour plus de facilité lors des recherches sur la colonne ou l'ensemble de colonnes concernées par la contrainte d'unicité, est affublée d'un index dit, chez MySQL, de type UNIQUE. Chaque valeur de la colonne ou de l'ensemble de colonnes devra être unique dans la table.
    INDEX est l'index normal, de base, qui autorise plusieurs fois la même valeur.

    Remarque : une colonne de clé étrangère doit être indexée et la colonne de référence de la clé étrangère doit être une clé primaire ou une colonne munie d'une contrainte d'unicité.

    L'AI est activée pour la clé index ID_agexe, est-ce bon
    AI, c'est l'AUTO_INCREMENT. Ça permet d'insérer des données sans mentionner de valeur pour la colonne concernée. Dans votre cas, la colonne ID_agexe aura des valeurs de 1 à n au fur et à mesure que vous insérerez des données dans la table.

    De plus, comment remplir lors de l'insertion des données ?
    Avec des requêtes INSERT :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    INSERT INTO la_table (sexe, age, FKdepart, FKtime)
    VALUES ('Homme', 56, 12, 25)
    1) Les valeurs fournies de FKdepart et de FKtime doivent être des valeurs pré-existantes dans la ou les tables de référence de ces colonnes.

    2) Un VACHAR(30) pour un sexe ? Il vaudrait d'ailleurs mieux avoir une table de référence des sexes et ici une clé étrangère pointant vers cette table.
    Exemple d'une telle table de référence :
    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
    -- Structure de la table tr_sexe_sxe
    CREATE TABLE referentiel.tr_sexe_sxe 
    (
    	sxe_id tinyint(4) NOT NULL COMMENT 'Identifiant du sexe',
    	sxe_abreviation char(1) NOT NULL COMMENT 'Abréviation (H = homme, F = Femme, I = inconnu)',
    	sxe_libelle varchar(8) NOT NULL COMMENT 'Libellé du sexe',
    	sxe_ordre tinyint(4) NOT NULL COMMENT 'Ordre d''affichage dans une liste'
    ) 
    ENGINE=InnoDB 
    DEFAULT CHARSET=utf8mb4
    COMMENT='Sexe d''une personne physique';
     
     
    -- Déchargement des données de la table tr_sexe_sxe
    INSERT INTO referentiel.tr_sexe_sxe (sxe_id, sxe_abreviation, sxe_libelle, sxe_ordre)
    VALUES
    	(0, 'I', 'Inconnu', 0),
    	(1, 'H', 'Homme', 1),
    	(2, 'F', 'Femme', 2);
     
    -- Index pour la table tr_sexe_sxe
    ALTER TABLE tr_sexe_sxe
      ADD PRIMARY KEY (sxe_id),
      ADD UNIQUE KEY xu_sxe_ordre (sxe_ordre),
      ADD UNIQUE KEY xu_sxe_abreviation (sxe_abreviation),
      ADD UNIQUE KEY xu_sxe_libelle (sxe_libelle);
     
    -- AUTO_INCREMENT pour la table tr_sexe_sxe
    ALTER TABLE tr_sexe_sxe
      MODIFY sxe_id tinyint(4) NOT NULL AUTO_INCREMENT COMMENT 'Identifiant du sexe', AUTO_INCREMENT=3;

    Et utilisation en clé étrangère dans une autre table :
    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
    -- Structure de la table th_personne_physique_pph
    CREATE OR REPLACE TABLE th_personne_physique_pph 
    (
    -- ...
      pph_id_sexe TINYINT NOT NULL DEFAULT 0 COMMENT 'Identifiant du sexe',
    -- ...
    ) 
    ENGINE=InnoDB 
    DEFAULT CHARSET=utf8mb4 
    COMMENT='Personne physique (hérite de te_personne_prs)';
     
    -- Index pour la table th_personne_physique_pph
    ALTER TABLE th_personne_physique_pph
    -- ...
      ADD KEY x_pph_id_sexe (pph_id_sexe),
    -- ...
     
    -- Contraintes pour la table th_personne_physique_pph
    ALTER TABLE th_personne_physique_pph
    -- ...
      ADD CONSTRAINT fk_pph_id_sexe FOREIGN KEY (pph_id_sexe) REFERENCES referentiel.tr_sexe_sxe (sxe_id) ON DELETE RESTRICT ON UPDATE CASCADE,
    -- ...
    3) Un INT(11) pour un âge, c'est également trop grand. Un TINYINT suffirait largement !

    4) FKtime laisse supposer qu'on s'attend à trouver la une donnée de type heure:minute et non pas un entier. À moins que ce soit une quantité entière de temps ?

    Je bloque souvent sur ce genre de détails et ai écumé, un peu, les sites de création de table et autre PHPmyadmin forum.
    PHPMyAdmin n'est qu'une application qui permet de gérer plus facilement les bases de données MySQL ou MariaDB. Ce qu'il faudrait commencé par faire, c'est apprendre le SQL un minimum ! Là, visiblement, vous ne savez pas ce que vous faites ! Je suppose que vous avez pourtant eu quelques cours sur le sujet des bases de données puisque vous avez un devoir à rendre, non ?

    Si vous voulez vraiment faire de la base de données, il faudrait même passer par la base : la conception de la BDD en écrivant les règles de gestion des données puis en réalisant un modèle conceptuel de données.
    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
    Nouveau candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2020
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2020
    Messages : 2
    Par défaut
    Bonsoir

    Merci pour les précisions de votre réponse. Vous avez pris du temps et c'est réellement appréciable.
    Je vais pouvoir m'atteler à la tâche.

    Ps: Pour ce qui est des cours, je n'ai pas pu les suivre bien malheureusement...

    Bien cordialement

Discussions similaires

  1. Liens entre formulaires et question sur les relations de tables
    Par Lenovice54 dans le forum Modélisation
    Réponses: 4
    Dernier message: 21/04/2017, 23h41
  2. Conception base avec relation de table
    Par Zeltron24 dans le forum Modélisation
    Réponses: 4
    Dernier message: 27/01/2010, 21h23
  3. [Débutante] Relation entre DBGrid et la Base de Données
    Par lilo415 dans le forum Bases de données
    Réponses: 14
    Dernier message: 01/03/2007, 15h51
  4. Script permettant de créer l'ensemble des indexes d'une base
    Par matacars dans le forum MS SQL Server
    Réponses: 7
    Dernier message: 01/07/2005, 16h14
  5. Créer un index pour une Base de données
    Par john7 dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 31/01/2005, 21h43

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