Partage
  • Partager sur Facebook
  • Partager sur Twitter

Base de donnée dans une autre base de donnée

    14 septembre 2017 à 14:49:13

    Bonjour,

    Je ne suis pas très bon en base de données donc si ma question vous parait aberrante veuillez m'excuser. J'ai une base de données contenant des utilisateurs, j'aimerais que dans une de mes cellules de la ligne, j'ai une autre base de données contenant des lignes. Je ne sais pas si je me suis bien fait comprendre.

    Le But :

    ma deuxième base de données contient des notifications. Le but, c'est que lorsque je déclare une notification dans mon site web, celle-ci soit créée dans une cellule de chaque utilisateur. Une fois que l'utilisateur affiche la notification sur mon site web, un php est lancé pour supprimer celle-ci.

    Vous l'avez compris mon but est de faire un système de notification pour mon site web.

    Merci de bien vouloir m'apporter votre aide

    • Partager sur Facebook
    • Partager sur Twitter
      14 septembre 2017 à 15:19:49

      Bonjour,

      dikdableu a écrit:

      Je ne suis pas très bon en base de données

      Oui ...

      Lorsque tu parles de base de données, en fait tu parles de tables ...

      Lorsque l'on développe une application qui va gérer des données, la première chose à faire c'est une modélisation entités/relations. Je te conseille la lecture du document "Conception BDD" ...

      Bon, ici tu as des utilisateurs et des notifications, deux entités, donc deux tables.

      Un utilisateur a plusieurs notifications et une notification est associée à un utilisateur. C'est une relation de un à plusieurs, donc une clé étrangère dans la table notification.

      Ton modèle serait :

      • utilisateur ( id [pk], etc. )
      • notification ( id [pk], id_utilisateur [fk], etc. )

      dikdableu a écrit:

      j'aimerais que dans une de mes cellules de la ligne, j'ai une autre base de données contenant des lignes

      Cela ne se fait pas dans une base de données relationnelles (principalement SQL), il faut passer par la modélisation avec clé étrangère comme proposée.

      En revanche il existe des bases de données non relationnelles (dites NoSQL) avec lesquelles tu peux en effet fonctionner avec un "tableau dans un tableau" ...

      • Partager sur Facebook
      • Partager sur Twitter
      Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
        14 septembre 2017 à 15:25:03

        J'ai lu pas mal de cours, mais j'ai vraiment du mal à saisir la logique.

        Le truc, c'est qu'un utilisateur a plusieurs notifications, mais une notification est associée à tout mes utilisateurs. Chaque utilisateur a une copie de la notification dans sa ligne.

        Benzouye a écrit:

        En revanche il existe des bases de données non relationnelles (dites NoSQL) avec lesquelles tu peux en effet fonctionner avec un "tableau dans un tableau" ...

        Je vais me pencher sur ces bases non relationnelles



        -
        Edité par dikdableu 14 septembre 2017 à 15:28:02

        • Partager sur Facebook
        • Partager sur Twitter
          14 septembre 2017 à 15:43:27

          dikdableu a écrit:

          J'ai lu pas mal de cours, mais j'ai vraiment du mal à saisir la logique.

          Dans ma signature tu as un document que je trouve assez bien fait : "Conception BDD". Peut-être t'aidera-t-il ...

          Sinon, selon tes dernières précisions, un utilisateur peut recevoir plusieurs notifications, et une notification est envoyé à plusieurs utilisateurs (tous en fait). C'est une relation de plusieurs à plusieurs (n,n) qui implique la création d'une table de relation ... Et oui c'est un poil plus complexe ...

          Dans ce cas le modèle serait :

          • utilisateur ( id [pk], nom, prenom, etc. )
          • notification ( id [pk], texte, date, etc. )
          • utilisateur_notification ( id_notification [fk], id_utilisateur [fk], flag_lu )

          Avec ce modèle, tu peux faire un truc de ouf ! :D

          Tu crées tous tes utilisateurs dans la table utilisateur (c'est original ça), chacun avec son id unique.

          Tu crées une notification dans la table notification (toujours original), avec son id unique.

          Pour diffuser cette notification à tous tes utilisateurs, il te "suffit" de créer une ligne par utilisateur dans la table utilisateur_notification.

          Cela peut se faire avec une requête SQL que tu lances dans ton programme une fois que tu as récupéré l'id de la notification créée :

          INSERT INTO utilisateur_notification ( id_utilisateur, id_notification, flag_lu )
              SELECT id, 'id notification créée', 0
              FROM utilisateur;

          Mais tu peux carrément dire à ta base de données de diffuser cette notification à tous les utilisateurs automatiquement ... comment ? A l'aide d'un TRIGGER :

          DELIMITER &&
          
          CREATE TRIGGER diffuse_notification
          AFTER INSERT ON notification
          FOR EACH ROW
          BEGIN
          	INSERT INTO utilisateur_notification ( id_utilisateur, id_notification, flag_lu )
          		SELECT id, NEW.id, 0
          		FROM utilisateur;
          END&&
          
          DELIMITER ;

          Une fois ce trigger mis en place (une seule fois), pour chaque insertion de notification tu diffuseras à tous les utilisateurs.

          La colonne flag_lu est un booléen valant 0 ou 1, 0 = non lu, 1 = lu, qui te permettra de gérer l'affichage des notifications.

          Si tu as beaucoup d'utilisateurs (des milliers) et beaucoup de notification (plusieurs par jour), alors tu pourrais mettre en place un système de purge de la table utilisateur_notification pour y supprimer périodiquement les lignes flag_lu = 1 ...

          • Partager sur Facebook
          • Partager sur Twitter
          Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
            21 septembre 2017 à 13:21:24

            Whoa merci !

            Je comprend pas très bien ta commande SQL.

            Tu inseres dans la table utilisateur_notification et les colonnes id_utilisateur, id_notification, flag_lu quels valeurs ?

            Dans ta commande  tu mets :

            SELECT id, 'id notification créée', 0
                FROM utilisateur;

            A quoi correspond id ? Je relance une commande pour récup l'id de la notif ou je peux le faire dès l'insertion ?

            Où dois-je lancer l'insert ?

            ------------------------------------------

            Avec tes conseils j'ai fais ca (code de notif.php) :

            if(isset($_POST['Envoyer'])){
            	
            $id = substr($_SESSION['identifiant'], 0,strrpos($_SESSION['identifiant'],'@'));
            $titre = $_POST['titre'];
            $commentaire = $_POST['comment'];
            $panda = $_POST['choix'];
            $num = $_POST['numic'];
            $cause = $_POST['cause'];
            $datedeb = $_POST['datedeb'];
            $datefin = $_POST['datefin'];
            $date = gmdate('Y-m-d H:i:s');
            
            	
            	$PDO->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
            	$st = $PDO->prepare("INSERT INTO notif(idnotif, titre, comment, choix, numic, cause, datedeb, datefin, id) VALUES(NULL, :titre, :comment, :choix, :numic, :cause, :datedeb, :datefin, :id, :date);");
            	$st->execute(array(
            		':titre' => $titre,
            		':comment' => $commentaire,
            		':choix' => $panda,
            		':numic' => $num,
            		':cause' => $cause,
            		':datedeb' => $datedeb,
            		':datefin' => $datefin,
            		':id' => $id));
            					
            	$requete = $PDO->query("SELECT idnotif FROM notif WHERE date = :date;")->fetch();
            	$requete->execute(array(
            		':date' => $date));
            	$requete1 = $PDO->query("SELECT id FROM authentification_dor WHERE Identifiant = :identifiant;")->fetch();
            	$requete1->execute(array(
            		':identifiant' => $_SESSION['identifiant']));
            				
            	$requete2 = $PDO->query("INSERT INTO utilisateur_notification ( id_utilisateur, id_notification, flag_lu ) SELECT :id_utilisateur, :id_notification, 0 FROM authentification_dor;")->fetch();
            	$requete2->execute(array(
            		':id_utilisateur' => $requete1,
            		':id_notification' => $requete));
            		
            	
            }



            -
            Edité par dikdableu 21 septembre 2017 à 14:38:44

            • Partager sur Facebook
            • Partager sur Twitter

            Base de donnée dans une autre base de donnée

            × 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