Partage
  • Partager sur Facebook
  • Partager sur Twitter

Avis Tables et champs

Sujet résolu
    3 février 2023 à 12:57:17

    Bonjour,

    J'aimerais vos avis pour savoir si mes tables et champs sont optimales et si il n'y a pas une meilleure façon de stocker ces informations. Je m'explique, j'ai 3 tables :

    riders : id, firstname, lastname, etc ...
    link_family : id, name
    families : id, rider_1_id, link_family_1, rider_2_id, link_family_2

    Mes coureurs sont listés dans la table riders. Dans la table link_family, il y a le type de relation entre 2 coureurs comme 'Père', 'Frère', etc .. Et dans ma table families, il y a l'ID des deux coureurs qui ont une relation (rider_1_id & rider_2_id) et la relation entre les 2 (link_family_1 & link_family_2)

    Voyez-vous une meilleure façon pour stocker les relations entre 2 coureurs ?

    Merci ;)

    • Partager sur Facebook
    • Partager sur Twitter
      4 février 2023 à 20:36:46

      Bonjour,

      Si j'ai bien compris, le but de tes tables sont de lister les coureurs, de lister le lien de parenté des coureurs (frère, sœur, mère, père...) et de lister les relations entre les deux.

      Je crois que pour répondre à ta problématique, nous avons besoin d'en savoir plus sur les relations possibles entre tes identités.

      • L'entité RIDERS sert à stocker les coureurs, ça, c'est très clair
      • Les entités FAMILIES et LINK_FAMILY sont pour moi inversées : dans FAMILIES, je mettrais un identifiant de famille (clé primaire) et les attributs propres à chaque famille (frère, sœur, mère, père...). Et dans LINK_FAMILY, je devrais avoir la relation entre les membres d'une famille.

      Pour répondre à ta question, il faut déjà savoir quelle est la relation entre les entités RIDERS et FAMILIES : 1 coureur peut avoir combien de liens de lien de relation avec un autre coureur ? 1 seul lien ? ou un nombre de liens indéfinis ?

      Car suivant la réponse le modèle de conception de tes tables ne sera pas la même :

      • Si un coureur peut avoir 1 seul lien avec un autre coureur, il faudra mettre cette relation dans la table RIDERS
      • Si un coureur peut avoir plusieurs liens avec un autre coureur, alors ton modèle de base est bon à l'exeption qu'il faudra réorganiser tes attributs ;
      id, rider_1_id, link_family_1, rider_2_id, link_family_2

      deviendra quelque chose comme ça :

      |id   |rider_id| families_id|
      |-----|--------|------------|
      |1    |1       |1           |
      |2    |1       |2           |

      Bon courage !


      • Partager sur Facebook
      • Partager sur Twitter
        5 février 2023 à 22:49:02

        Merci pour ta réponse. Oui, un rider peut avoir plusieurs liens.

        J'aimerais par exemple indiquer que Pierre et Paul sont frères : Dans la table families, je rentre l'id de pierre, l'id de frère,  l'id de paul et l'id de frère aussi.

        Autre exemple : Jacques est le père de Jean : id de jacques, id de père, id de jean, id fils

        En gros, il faut que je stock dans une table l'id des deux coureurs qui ont la relation et le type de relation entre eux

        Comme ça, quand je suis dans la fiche d'un rider, j'aimerais qu'il m'affiche avec une requête les relations avec les autres riders mais je ne suis pas certain de mes tables et champs pour bien stocker ceci

        -
        Edité par sebcas 5 février 2023 à 22:52:45

        • Partager sur Facebook
        • Partager sur Twitter
          6 février 2023 à 20:49:47

          Bonjour sebcas,

          Pour ma part j'aurais simplifié un peu ta table Relation de la façon suivante :

          DROP TABLE IF EXISTS link_family;
          DROP TABLE IF EXISTS riders;
          DROP TABLE IF EXISTS families;
          
          CREATE TABLE IF NOT EXISTS riders (
          	id int PRIMARY KEY AUTO_INCREMENT NOT NULL,
          	firstname varchar(255) NOT NULL,
          	lastname varchar(255) NOT NULL
          );
          
          CREATE TABLE IF NOT EXISTS families (
          	id int PRIMARY KEY AUTO_INCREMENT NOT NULL,
          	name varchar(255) UNIQUE NOT NULL
          );
          
          CREATE TABLE IF NOT EXISTS link_family (
          	id int PRIMARY KEY AUTO_INCREMENT NOT NULL,
          	id_rider_1 int,
          	link_rider int,
          	id_rider_2 int,
          	CONSTRAINT fk_rider_1 FOREIGN KEY (id_rider_1) REFERENCES riders(id),
          	CONSTRAINT fk_link_rider FOREIGN KEY (link_rider) REFERENCES families(id),
          	CONSTRAINT fk_rider_2 FOREIGN KEY (id_rider_2) REFERENCES riders(id)
          );
          
          INSERT INTO riders (firstname, lastname) VALUES
          	('John', 'DOE'),
          	('Annette', 'DUPOND'),
          	('Jacques', 'BEAUREGARD'),
          	('Alfred', 'PENNYWORTH'),
          	('Henri', 'IV');
          
          INSERT INTO families (name) VALUES
          	('Père'),
          	('Mère'),
          	('Fils'),
          	('Fille'),
          	('Frère'),
          	('Soeur');
          
          INSERT INTO link_family (id_rider_1, link_rider, id_rider_2) VALUES
          	(1, 1, 3),
          	(3, 3, 1),
          	(1, 1, 4),
          	(4, 3, 1),
          	(2, 2, 5),
          	(5, 3, 2);
          
          /*
          SELECT *
          FROM riders AS r
          INNER JOIN link_family AS lf
          ON r.id = lf.id_rider_1
          INNER JOIN families AS f
          ON lf.link_rider = f.id;
          */
          
          SET @rider_id = 1; -- ID du Rider dont on veut voir les relations
          
          SELECT CONCAT(r.firstname, ' ', r.lastname) AS Nom, f.name AS Relation
          FROM riders AS r
          INNER JOIN link_family AS lf
          ON r.id = lf.id_rider_1
          INNER JOIN families AS f
          ON lf.link_rider = f.id
          WHERE lf.id_rider_2 = @rider_id;

          Cela implique par contre de rentrer 2 lignes à chaque fois dans ta table

          link_family

           Autrement dit :

          • Rider 1 est le père de Rider 2
          • Rider 2 est le fils de Rider 1

          Et ainsi de suite pour tous tes enregistrements.

          Après on peut aussi rester sur ton idée qui est d'enregistrer toutes les relations dans la même ligne, par contre tu vas avoir une redondance des données. Par exemple si "John" a 5 enfants, tu vas avoir 5 fois l'ID de "John" avec l'ID de "Père".

          En espérant t'avoir un peu éclairé :)

          • Partager sur Facebook
          • Partager sur Twitter
            6 février 2023 à 23:24:57

            Je viens d'avoir une idée qui n'empêchera pas d'avoir une relation > 1.

            Tu pourrais faire ta table Riders ainsi :

            TABLE RIDERS :
              id_rider
              prenom_rider
              nom_rider
              pere_rider (nullable pour celui qui n'a pas de papa rider)
              famille_rider (nullable. On peut être père de plusieurs familles)




            Tu ajoutes une table Familles comme suit :

            TABLE FAMILLES :
              id_famille (c'est tout)


            Maintenant, un exemple, Albert est le père de Bertrand, Carlos d'une première famille. Il s'est séparé, a fondé une nouvelle famille de riders, dont les enfants sont Dan et Édouard.

            tu enregistrerais comme ceci :

            RIDERS :
            1, 'Albert', 'nomDeFamille', NULL, NULL
            2, 'Bertrand', 'nomDeFamille', 1, 1
            3, 'Carlos', 'nomDeFamille', 1, 1
            4, 'Dan', 'nomDeFamille', 1, 2
            5, 'Edouard', 'nomDeFamille', 1, 2



             Et si tu veux les familles fondées par le papa. Tu fais une relation 1-n entre Albert ici, et les familles aux id 1 et 2.



            -
            Edité par CristianoRolando 6 février 2023 à 23:26:43

            • Partager sur Facebook
            • Partager sur Twitter
              9 février 2023 à 22:17:51

              Merci pour les conseils, j'y vois plus clair ;)
              • Partager sur Facebook
              • Partager sur Twitter
                10 février 2023 à 0:43:20

                Je n'ai pas été clair à la fin.

                Pour la table Familles :

                FAMILLES :
                  id_famille
                  # id_pere (fait référence à Riders.id_rider)



                • Partager sur Facebook
                • Partager sur Twitter
                  17 février 2023 à 16:09:32

                  Avec cette derniere solution, tu perds le concept de frère/soeur, soit le genre, mais si tu y tiens, tu peux rajouter le genre du raider dans la table comme ca l'info est toujours la.
                  • Partager sur Facebook
                  • Partager sur Twitter

                  Avis Tables et champs

                  × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                  × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                  • Editeur
                  • Markdown