Partage
  • Partager sur Facebook
  • Partager sur Twitter

Infos dans le bon ordre

Insertion, supression, création mais toujours nickel

Sujet résolu
    8 mars 2023 à 20:59:12

    Bonjour à Toutes et à Tous,

    Cela faisait un bon moment que je n'étais pas revenu sur ce forum et c'est donc avec une certaine émotion que je poste mon sujet.

    Je me creuse un peu la tête sur un problème qu'une personne m'a posé et qui me taraude. J'ai jeté un œil dans mes livres du Site du Zéro...

    Il s'agit d'utilisé une liste d'idées (qui dépendent d'une partie de projet définit dans une autre base et qui servira " d'index " ) mais l'utilisateur veut pouvoir insérer une idée entre deux idées déjà existantes, en effacer ou en créer. Voir remettre dans un autre ordre.

    Je ne voulais pas toucher à la clé primaire mais mettre un numéro d'ordre. Cependant, si une idée est insérée entre la n°150 et 151 et qu'il existe 300 idées : je dois renuméroter idées suivantes (la 151 devient la 152, la 152 devient la 153 et ainsi de suite).

    Je trouve ça un peu lourd et me fais penser à mes premières bases en basic (qui n'étaient pas aussi souple que du SQL).

    Ma question : existe-il un moyen de le faire simplement et rapidement ? Sachant que la base ne sera pas conséquente et sera utilisé en mode local (pas de mise en ligne, c'est juste un outil d'aide).

    Je vous remercie pour toutes vos suggestions.

    • Partager sur Facebook
    • Partager sur Twitter
      8 mars 2023 à 22:21:38

      Salut

      Est-ce que ça t'aide si je te dis que, dans le cas où tu souhaites insérer une tâche avant une autre, il suffit d'avoir l'ID de cette autre tâche d'ajouter 1 à la position de toutes celles qui ont une position plus grande ou égale à celle déjà en base ?

      Donc

      1. tu récupères l'ID de la tâche qui viendra après la nouvelle
      2. tu récupères la position de la tâche du point précédent
      3. tu ajoutes 1 à toutes les positions plus grandes ou égales à la position du point 2
      4. tu insères la nouvelle tâche avec la position du point 2
      • Partager sur Facebook
      • Partager sur Twitter
        9 mars 2023 à 21:50:00

        Ymox a écrit:

        Salut

        Est-ce que ça t'aide si je te dis que, dans le cas où tu souhaites insérer une tâche avant une autre, il suffit d'avoir l'ID de cette autre tâche d'ajouter 1 à la position de toutes celles qui ont une position plus grande ou égale à celle déjà en base ?

        Donc

        1. tu récupères l'ID de la tâche qui viendra après la nouvelle
        2. tu récupères la position de la tâche du point précédent
        3. tu ajoutes 1 à toutes les positions plus grandes ou égales à la position du point 2
        4. tu insères la nouvelle tâche avec la position du point 2

        Merci @Ymox pour ta piste. C'était mon idée de base. De ce fait, il faut de retrouve la méthode de ré-indexation de la base en PHP (je me demande s'il n'existe pas une instruction ou quelque chose dans ce genre). Je suis preneur d'autres pistes. Merci encore @Ymox
        • Partager sur Facebook
        • Partager sur Twitter
          10 mars 2023 à 9:30:25

          Heu… c'est quoi réindexer la table pour toi ? Parce qu'une simple requête de mise à jour avec la position d'insertion pour critère devrait suffire, si c'est bien ce que je pense (et du coup, ce serait plus un sujet pour le forum des bases de données). D'autant que tu précises que tu n'auras pas trop d'enregistrements, et que j'ai souvent eu entendu/lu que jusqu'à 100'000 enregistrements, MySQL s'en sort bien niveau performances.

          Il y a effectivement d'autres possibilités, dont notamment une qui demande d'avoir des positions non plus sous forme d'entiers mais de nombres à virgule, ou alors un incrément automatique particulièrement grand afin d'avoir de la place pour insérer entre deux éléments.

          -
          Edité par Ymox 10 mars 2023 à 9:36:06

          • Partager sur Facebook
          • Partager sur Twitter
            10 mars 2023 à 20:58:04

            Merci Ymox pour tes pistes. J'avais pensé à mettre 1000 de différence entre chaque idées et d'aller puiser entre ce millier à l'insertion de chaque idée. En revanche, je n'avais pas pensé au nombre à virgule.

            J'avais posté ce sujet dans le PHP car je ne savais pas trop où le placer : PHP ou SQL ?

            Encore merci pour ton aide.

            EDIT : Ymox, tu as raison : je vais reposer ma question dans la section base de données (sans omettre de citer tes pistes et toi).

            -
            Edité par stefparis 10 mars 2023 à 21:49:22

            • Partager sur Facebook
            • Partager sur Twitter
              11 mars 2023 à 0:01:45

              stefparis a écrit:

              EDIT : Ymox, tu as raison : je vais reposer ma question dans la section base de données (sans omettre de citer tes pistes et toi).

              Bonsoir, non vous pouvez avertir la modération pour que le sujet soit déplacé. Je déplace et ferme le doublon.

              Déplacement vers un forum plus approprié

              Le sujet est déplacé de la section PHP vers la section Base de données



              • Partager sur Facebook
              • Partager sur Twitter
                11 mars 2023 à 11:51:43

                Merci @AbcAbc6 pour le déplacement du sujet. Effectivement, c'est pourtant plus simple de déplacer le sujet.
                • Partager sur Facebook
                • Partager sur Twitter
                  11 mars 2023 à 20:32:16

                  Les nombres à virgule, ça va poser un problème parce qu'ils ont une précision limitée.

                  Une idée comme ça : utiliser des chaînes de caractères comme critère d'ordre

                  Supposons qu'on n'utilise que les lettres a-z

                  Principe général : pour insérer entre deux chaines successives, regarder là où ça commence à différer.

                  • soit l'écart entre ces lettres est juste de 1, exemple  abcxyz et abduvw qui diffèrent sur la 3ieme lettre dans ce cas prendre les 4 premières lettre du premier + une lettre au milieu de l'alphabet (m), ce qui donne  abcm
                  • soit l'écart est de plus d'une lettre, exemple   abcxyz et abhuvw, (diffèrent sur la 3ieme lettre) prendre le préfixe commun + une lettre au milieu de c, h , par exemple e, ce qui donne abe
                  Comme ça il n'y a jamais besoin de renuméroter.
                  Laissé en exercice :
                  • chercher comment insérer au début, en conclure qu'il ne faut pas commencer par "a" :-)
                  • voir pour le dernier (changer la première lettre qui n'est pas un z ? ajouter un a à la fin ?)
                  Indication; pour le premier, prendre "ab". Parce qu'il est possible de mettre "aab" avant lui, et "aaab" encore avant etc.

                  -
                  Edité par michelbillaud 11 mars 2023 à 20:56:30

                  • Partager sur Facebook
                  • Partager sur Twitter
                    12 mars 2023 à 20:58:21

                    Merci @michelbillaud pour cette piste.

                    Dans mes rêves, il y aurait un INSERT BETWEEN INDEX (avec nom de l'index) n°X et n°Y AND REINDEX AFTER Y.

                    En traduisant, insertion de l'enregistrement entre le n°X et Y et ré-indexe la table en partant de Y. Je sais, je rêve.

                    • Partager sur Facebook
                    • Partager sur Twitter
                      13 mars 2023 à 9:55:49

                      J'ai pas lu en détails toutes les réponses, mais je serais sur un tri alphabétique, avec des numéros.

                      Si tu as les id 1 2 et 3. Que tu veux rajouter une ligne entre 1 et 2, tu vois que y'a pas de place, donc tu rajoutes un 5 => 15. (ou un 1 pour 11)

                      Ensuite tu veux rajouter un truc entre 1 et 15, tu as le choix entre 11 12 13 14. 

                      Si tu as 1 et 11 et que tu veux insérer entre, tu vas devoir faire un truc comme 105 etc.

                      J'ai pas réfléchi au truc en détails, à voir niveau code et requête comment faire ca au plus simple, mais ca se fait.

                      Ah, je viens de voir que c'est la même proposition que michelbillaud, version chiffre à la place des lettres. Peut etre que niveau algo ca se gère mieux avec des chiffres car plus simple à comparer ? je sais pas trop, à tester.

                      • Partager sur Facebook
                      • Partager sur Twitter
                        13 mars 2023 à 10:32:24

                        Sinon, blague à part, va pas y avoir beaucoup de données dans la base, qui a l'air d'être faite pour un programme interactif, donc renuméroter c'est pas gênant concrètement.

                        Flashback sur les versions de Basic des années 70, où les lignes étaient automatiquement numérotées de 10 en 10, ce qui laisse de la place pour des insertions sans avoir à décaler.  Avec une commande de renumérotation.

                        https://hwiegman.home.xs4all.nl/gw-man/RENUM.html

                        -
                        Edité par michelbillaud 13 mars 2023 à 10:34:42

                        • Partager sur Facebook
                        • Partager sur Twitter
                          14 mars 2023 à 20:21:25

                          michelbillaud a écrit:

                          Sinon, blague à part, va pas y avoir beaucoup de données dans la base, qui a l'air d'être faite pour un programme interactif, donc renuméroter c'est pas gênant concrètement.

                          Flashback sur les versions de Basic des années 70, où les lignes étaient automatiquement numérotées de 10 en 10, ce qui laisse de la place pour des insertions sans avoir à décaler.  Avec une commande de renumérotation.

                          https://hwiegman.home.xs4all.nl/gw-man/RENUM.html

                          -
                          Edité par michelbillaud hier à 10:34


                          Tu as raison. C'est ce que je vais faire en mettant 1000 entre chaque " idée " dans une colonne à part. Je pourrais faire la différence entre les deux lignes d'insertion en divisant par deux. Je prévois un petit outil de maintenance pour tout renuméroter de 1000 en 1000 au cas où (un simple update).

                          Merci ;-)

                          • Partager sur Facebook
                          • Partager sur Twitter
                            14 mars 2023 à 20:29:07

                            Heu, si jamais, renuméroter le tout de 1000 en 1000 en une fois risque d'être un peu plus lourd que mettre à jour uniquement les "anciennes" tâches à chaque insertion spécifique, à mon avis — sauf si tu insères beaucoup plus souvent en tête de liste, auquel cas je te conseillerais alors… de trier du plus grand au plus petit  ;)

                            • Partager sur Facebook
                            • Partager sur Twitter
                              7 août 2023 à 10:30:55

                              Merci à Tous pour votre aide. En fait, vu le peu d'idée à mettre, j'ai mis un numéro de 1000 en 1000. En cas d'insertion, l'idée devient la 2500 par exemple et si une nouvelle est insérée, elle devient la 2750 et ainsi de suite. J'ai prévu un petit utilitaire qui renumérote tout de mille en mille s'il y a trop d'idées insérées (mais pas encore développé).

                              Encore merci à Tous.

                              • Partager sur Facebook
                              • Partager sur Twitter

                              Infos dans le bon ordre

                              × 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