Partage
  • Partager sur Facebook
  • Partager sur Twitter

organisation/ conception Base de données

    13 août 2019 à 20:37:15

    Bonjour je souhaite créer une base de donnée qui contient des sous catégories

    j'entends par là, par exemple:

    petit bricolage: 

    *électricité

    *plomberie

    *...

    soutien scolaire: 

    *math

    *anglais

    *...

    Mais niveau conception, je souhaiterais avoir l'architecture la plus efficace et et ergonomique SVP MERCI

    • Partager sur Facebook
    • Partager sur Twitter
      14 août 2019 à 0:56:22

      Salut,

      Pour ce qui est de créer la liste des catégories en elle-même, tu devrais sans doute avoir une table qui les reprend toutes sous une forme proche de

      CREATE_TABLE Categories (
      ID INT PRIMARY KEY NOT NULL, # l'identifiant de chaque catégorie
      NAME VARCHAR(25) # le nom de la catégorie (max 25 caractères)
      );

      Et c'est tout ;)

      Tu pourrais la remplir avec des instructions proches de

      INSERT INTO Categories VALUES (1,"petit bricolage");
      INSERT INTO Categories VALUES (2,"électicité");
      INSERT INTO Categories VALUES (3,"plomberie");
      # ... 
      INSERT INTO Categories VALUES (N,"Anglais");

      Par la suite, tu voudras sans doute créer une table qui regroupe différentes activités, qui se rattachent à ces catégories.  Tu devras alors prévoir un champs de cette nouvelle table  qui prendra la valeur du champs ID d'un des enregistrements de la table Categories en tant que clé étrangère (foreign key en anglais).  Idéalement, tu t'assureras de ce qu'on appelle "l'intégrité référentielle" de cette clé étrangère.  C'est à dire 

      • que seules les valeurs du champs ID des enregistrements de la table Catégories sont autorisées
      • que, si l'on en vient (pour une raison ou une autre) à supprimer un enregistrement de la table Categories, tous les enregistrementde cette nouvelle table qui font référence au champs ID de l'enregistrement supprimé dans la table Categories devront aussi être supprimés (normal, vu ... qu'ils ne correspondront plus à l'un des enregistrements qui existent)

      Cette nouvelle table pourrait être crée sous une forme proche de

      CREATE_TABLE Activities(
      ID INT PRIMARY KEY NOT NULL, # l'identifiant de chaque activité
      BEGIN DATETIME NOT NULL,         # l'activité commence à une date et une heure bien précise
      END DATETIME NOT NULL,           # l'activité termine à une date et une heure bien précise
      # d'autres champs sont possibles 
      ID_CATEGORIES INT NOT_NULL,
      FOREIGN KEY(ID_CATEGORIES ) REFERENCES Categories(ID)
      );

      Pour certaines activités (comme l'anglais, le petit bricolage ou le soutien scolaire) , il se peut que tu envisages de les pratiquer avec un (ou pliseurs) personnes. Le simple fait qu'il puisse effectivement y avoir plusieurs personnes qui pratiquent une activité "en groupe" tend à plaider pour que l'on crée le groupe participant  à une activté donnée en dehors de la table Activité.

      Et, bien sur, nous devrons pouvoir identifier les différents participants à une activité données. Mais nous ne devons pas oublier qu'un participant donné peut participer à ... plusieurs activités différentes, pour autant qu'elles n'aient pas lieu (ne serait-ce qu'en partie) au même moment :p

      Nous devrions donc créer une table Personnes pour pouvoir maintenir les données relatives aux différents participants, qui prendait sans doute une forme proche de

      CREATE TABLE Personnes(
      ID INT PRIMARY KEY NOT NULL, #une clé, unique pour chaque personne
      NAME VARCHAR(30) NOT NULL, #le nom de chaque personne
      FIRSTNAME  VARCHAR(30) NOT NULL, # et son prénom
      PHONE VARCHAR(15), #un numero de téléphone,mais tout le monde n'en a pas
      GSM  VARCHAR(15),# un numéro de GSM,mais tout le monde n'en a pas
      MAIL VARCHAR(255), #une adresse E-mail,mais tout le monde n'en a pas
      );

      Grâce à cette table, nous aurions "tout ce qu'il faut" pour pouvoir créer une table permettant de représenter les groupes participant aux  différentes activités.

      Pour ce faire, il "suffit" de créer une table (nommons la Groupes, pour l'exemple) qui contienne au moins deux champs:

      • un champs ID_ACTIVITES qui sera une clé étrangère sur le champs ID de la table Activites et
      • un champs ID_PERSONNE qui sera une clé étrangère sur le champs ID de la table Personnes

      Reste le problème de la clé primaire, car SQL n'aime pas ** trop ** quand une table ne dispose pas de clé primaire :p

      *** Certains ***  SGBDR permettent de créer une clé primaire composée de plusieurs champs.  Et, comme une même personne ne peut participer qu'une seule et unique fois à une activité bien particuière (personne n'a -- à ce jour -- le don d'ubiguité qui lui permettrait d'être deux fois au même endroit au même moment :D), si le système de base de donnée le permet, nous pourrions donc créer une clé primaire sur les deux champs dont j'ai déjà parlé.

      Par contre, si le système ne permet pas la création d'une clé primaire composée de plusieurs champs, il faudra envisager d'ajouter un troisième champs (ID) qui pourra servir à cette fin ;)

      Tu le remarqueras, je suis allé beaucoup plus loin que ta demande d'origine.  Mais c'est parce que ta demande ne rimait à rien si on s'arrêtait à ce que tu demandais : une base de donnée ne sert absolument à rien si les données que l'on souhaite y placer ne sont pas ... mises en relation les unes avec les autres. Et tout part du principe qu'une catégorie d'activité ne sera utile que ... si tu crées des activités qui  y font référence ;)

      • Partager sur Facebook
      • Partager sur Twitter
      Ce qui se conçoit bien s'énonce clairement. Et les mots pour le dire viennent aisément.Mon nouveau livre : Coder efficacement - Bonnes pratiques et erreurs  à éviter (en C++)Avant de faire ce que tu ne pourras défaire, penses à tout ce que tu ne pourras plus faire une fois que tu l'auras fait
        15 août 2019 à 0:20:35

        Merci pour ton aide 

        et j'ai donc créer une table categories avec  id_categorie, name_categorie

        je vais créer une table details avec id_detail, name_detail, id_categorie

        donc il faudrait que je fasse une requête insert into values ('valeur 1'), ('valeur 2') avec un paramêtre fixe id_categorie

        mais je n'ai pas trouvé comment lié un paramètre.

        • Partager sur Facebook
        • Partager sur Twitter
          15 août 2019 à 12:52:36

          La requête d'insertion dans ta table détails serait sans doute proche de

          insert into details values (<id_details>, <name_details>,
              select id from categorie where name_detail = <categorie_recherchee> );

          où <id_details> et <name_details> correspondent aux valeurs connue à ajouter et où <categorie_recherchee> correspond au nom de la catégorie pour laquelle on a besoin de l'identifiant ;)

          Ceci dit, je subodore, à voir tes questions, que tu ne connais absolument rien au langage SQL et à la gestion des bases de données.  Peut être devrais tu, en extrême priorité, commencer par essayer de suivre un cours ou un tutoriel ou l'autre sur le sujet ;)

          -
          Edité par koala01 15 août 2019 à 12:54:22

          • Partager sur Facebook
          • Partager sur Twitter
          Ce qui se conçoit bien s'énonce clairement. Et les mots pour le dire viennent aisément.Mon nouveau livre : Coder efficacement - Bonnes pratiques et erreurs  à éviter (en C++)Avant de faire ce que tu ne pourras défaire, penses à tout ce que tu ne pourras plus faire une fois que tu l'auras fait
            15 août 2019 à 16:56:11

            merci pour ta réponse, mais j'ai beau chercher , je ne trouve pas la solution dans les cours ou les tutos. 

            Je cherche un code équivalent à

            $req=$pdo->prepare('INSERT INTO 'table2'('nom', 'id_table1') VALUES ('valeur 1', ':valeur2)');
            $req->bindparam(':valeur2', 'valeur_id_table1');
            exec $req USING valeur1 IN ('je', 'dis', 'que', 'tu');

            ou encore

            SET @categcory = 1; 
            PREPARE ajout FROM 'INSERT INTO table (id_category, colonne2) VALUES (@category, colonne2=?)';
            EXECUTE ajout USING colonne2 IN ('détail1', 'détail2');

             

            Je sais avoir mélangé les langages, mais c'était pour exprimer comme je peux ce que je cherche à faire

            -
            Edité par born1 16 août 2019 à 6:45:30

            • Partager sur Facebook
            • Partager sur Twitter

            organisation/ conception Base de données

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            • Editeur
            • Markdown