Gast: erste freie ID in einer Lücke finden

Hallo,

in einer Tabelle speichere ich Termine, die nach Überschreitung des Datums gelöscht werden.

Ich war immer so stolz auf die extrem kurzen Links, doch nun ist die ID im fünfstelligen Bereich und ich möchte die Lücken wieder nutzen.

Irgendwo war hier mal eine Diskussion, sowas auf keinen Fall zu tun, weil das Internet ja nichts vergisst und ur-uralte Links dann auf den falschen Termin verweisen. Sollen sie doch. Ich bin nicht dafür verantwortlich, wenn Google & Co längst nicht mehr erreichbare Seiten jahrelang als Leichen führen.

Also, wie finde ich die erste Lücke? Ich freue mich schon auf zwei- und dreistellige IDs.

Gast

  1. Hi,

    in einer Tabelle speichere ich Termine, die nach Überschreitung des Datums gelöscht werden.

    Ich war immer so stolz auf die extrem kurzen Links, doch nun ist die ID im fünfstelligen Bereich und ich möchte die Lücken wieder nutzen.

    Irgendwo war hier mal eine Diskussion, sowas auf keinen Fall zu tun, weil das Internet ja nichts vergisst und ur-uralte Links dann auf den falschen Termin verweisen. Sollen sie doch. Ich bin nicht dafür verantwortlich, wenn Google & Co längst nicht mehr erreichbare Seiten jahrelang als Leichen führen.

    Was bringt dir die kürzere URL? Die ID selber sagt nichts aus. In der Standard-Konfiguration weiß man wenigstens meistens, dass kleinere IDs "älter" sind (aber auch das ist nur ein grober Anhaltspunkt).
    Als nächstes machst du dir eine große Baustelle auf, nämlich derjenigen, dass du die IDs selbst generierst anstatt dies Auto-Increment/Sequenzen automatisch erledigen zu lassen. Ich würde an deiner Stelle einfach damit leben.

    Also, wie finde ich die erste Lücke? Ich freue mich schon auf zwei- und dreistellige IDs.

    Generiere eine (temporäre) Tabelle mit allen Zahlen. Dann suchst du die kleinste Zahl aus dieser Tabelle, welche nicht als ID in deiner Termintabelle enthalten ist.

    Bis die Tage,
    Matti

  2. Ich bin nicht dafür verantwortlich, wenn Google & Co längst nicht mehr erreichbare Seiten jahrelang als Leichen führen.

    Für den schlechten Eindruck deiner Seite bist du aber schon verantwortlich, wenn jemand in Google was findet oder sich einen Link merkt/weitergibt und die Seite kein bisschen mehr dazu passt ;-)

  3. Moin!

    Also, wie finde ich die erste Lücke?

    Bist Du sicher, dass Du Programmieren kannst oder willst?

    PSEUDOCODE:

    Funktion getFreeId  
    {  
        Alle IDs in einen Array einlesen und zwar so das diese keys (Schlüssel) sind:  
        [bsp: Array($id)=true; ]  
      
        Setze $i=0;  
        Schleife: So lange wahr wahr ist [bsp: while true {} oder while (1==1) ] {  
             prüfe ob Array[$i] gesetzt ist [bsp: if (isset (Array[$i]) ]  
             wenn ja:   { i um eins erhöhen und Schleife wiederholen }  
             wenn nein: { beende Funktion und gib i zurück,  [bsp: return $i ]  }  
        }  
    }
    

    MFFG (Mit freundlich- friedfertigem Grinsen)

    fastix

    1. Hi!

      Also, wie finde ich die erste Lücke?
      Bist Du sicher, dass Du Programmieren kannst oder willst?

      Die Frage könnte man auch mit "Suchen" stellen, das Thema ist ja nicht neu.

      PSEUDOCODE:

      So einfach ist es allerdings nicht. Web-Anwendungen sind üblicherweise Mehrnutzer-Systeme. Da ist es ungünstig, wenn man die ID ermittelt und sie erst in einem zweiten Schritt verwendet. Zwischen den Schritten kann jemand anderes schneller gewesen sein, und dann hat man größere Probleme als zu lange Zahlen in URLs. Es reicht also nicht nur, die ID zu ermitteln (was ich, wenn überhaupt, im DBMS mit einer Abfrage und nicht mit einer langsamen Schleife erledigen würde - und "im DBMS" bedeutet Stored Procedure o.ä.), man muss auch sicherstellen, dass man der einzige ist, während man die ID sucht und sie verwendet. Zum reinen Suchen kommt also noch hinzu, dass man sich mit Sperren auseinandersetzen muss. Und das muss sogar eine Lesesperre auf der Tabelle sein, damit nicht ein anderer Prozess auch grad auf die Idee kommt, nach einer freien ID zu suchen. Und so eine Lesesperre wirkt sich dann auch auf den ganz normalen Betrieb aus. Alternativ kann man auf die Lesesperre verzichten, muss aber dann auf Einfügefehler gefasst sein, weil die ID grad eben schon wieder eingetragen wurde, und den ID-Such- und Dateineintragsprozess gegebenenfalls wiederholen. Alles in allem ein viel zu großer Aufwand, wenn man es richtig machen will.

      Lo!

      1. Moin,

        So einfach ist es allerdings nicht. Web-Anwendungen sind üblicherweise Mehrnutzer-Systeme. Da ist es ungünstig, wenn man die ID ermittelt und sie erst in einem zweiten Schritt verwendet. Zwischen den Schritten kann jemand anderes schneller gewesen sein.

        Allerdings vermute ich mal, dass wenn man die ID direkt vor dem Benutzen vor dem Insert ermittelt, dass der Zeitabstand so gering ist, dass die Wahrscheinlichkeit eines gleichzeitigen Eintrages gegen 0 geht. Vor allem bei einem System, was nicht von Millionen Usern verwendet wird, sondern von < 10.

        Grüße Marco

        1. Hi!

          Web-Anwendungen sind üblicherweise Mehrnutzer-Systeme.
          Allerdings vermute ich mal, dass wenn man die ID direkt vor dem Benutzen vor dem Insert ermittelt, dass der Zeitabstand so gering ist, dass die Wahrscheinlichkeit eines gleichzeitigen Eintrages gegen 0 geht. Vor allem bei einem System, was nicht von Millionen Usern verwendet wird, sondern von < 10.

          Auf eine Menge kommt es nicht direkt an, das Prinzip funktioniert bereits mit zwei Anwendern. Die Wahrscheinlichkeit mag gering sein, wenn es nur einen Terminpfleger gibt. Die Zeit zwischen zwei Teilvorgängen kasnn auch durch Last von den Besuchern vergrößert werden. Wenn jedoch solche Fehler auftreten, dann liegt es in ihrer Natur sporadisch zu sein, so dass man sie im Labor sehr schwer findet, wenn man sich des Nebenläufigkeitsproblems nicht bewusst ist. Und da ich nicht weiß, wieviele Terminpfleger und Besucher sich das System teilen, erscheint mir der Hinweis angebracht.

          Lo!

          1. Moin,

            Und da ich nicht weiß, wieviele Terminpfleger und Besucher sich das System teilen, erscheint mir der Hinweis angebracht.

            Auf jeden Fall: Wichtig ist der Hinweis.

            Grüße Marco

      2. Moin!

        So einfach ist es allerdings nicht.

        Du hast im vollen Umfang recht: Es müsste außerdem noch eine Sperrung stattfinden. Aber ich wollte den Frager höchstens bis zu den Fußgelenken in den Boden rammen, nicht bis zum Hals.

        MFFG (Mit freundlich- friedfertigem Grinsen)

        fastix

  4. Duerfte ich noch bemerken, dass man durch senden eines entsprechenden Http Response Codes Google und andere Suchmaschinen darauf aufmerksam machen kann das die Resource weg (GONE?) ist bzw nicht vorhanden (404??).

    Ich halte es auch fuer unpassend alte Luecken wieder aufzufuellen. Wenn du lange Zahlen kuerzen willst, kannst du sie ja in ein anderes URL vertraegliches, alphanumerisches System umwandeln (Hexadezimal zum Bleistift).

    Ciao, Frank

    1. Hello,

      Duerfte ich noch bemerken, dass man durch senden eines entsprechenden Http Response Codes Google und andere Suchmaschinen darauf aufmerksam machen kann das die Resource weg (GONE?) ist bzw nicht vorhanden (404??).

      Ich halte es auch fuer unpassend alte Luecken wieder aufzufuellen.

      Das kommt immer auf den Zusammenhang an.

      Wenn ich Kino- oder Theatersitze vermarkte, dann will ich die Lücken selbstverständlich finden und schließen...

      Liebe Grüße aus dem schönen Oberharz

      Tom vom Berg

      --
       ☻_
      /▌
      / \ Nur selber lernen macht schlau
      http://bergpost.annerschbarrich.de
      1. Hi!

        Wenn ich Kino- oder Theatersitze vermarkte, dann will ich die Lücken selbstverständlich finden und schließen...

        Schlechter Vergleich. Kinositze verschwinden nicht aus der Datenhaltung, wenn sie nicht belegt sind. Sie sind über ein Belegt/Frei-Kriterium erkennbar. Oder, wenn man eine m:n-Beziehung zu den Vorstellungen hat, dann findet man freie Sitze durch das Nichtvorhandensein eines Verknüpfungsdatensatzes (Sitze LEFT JOIN Vorstellung ON ... WHERE Vorstellung.Id IS NULL).

        Lo!

    2. Moin!

      kannst du sie ja in ein anderes URL vertraegliches, alphanumerisches System umwandeln (Hexadezimal zum Bleistift).

      Da müsste schon ein größerer Klotz ran. Hier meine Funktionsbibliothek für derlei Fälle:

      <?php  
        
      function getBigNumArray() {  
      return array('0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z');  
      #return array ('0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f');  
      #return array ('0','1','2','3','4','5','6','7','8','9');  
      #return array('0','L');  
      }  
        
      function getBigNumHash() {  
      # kehrt den Array um. Es entsteht ein Hash  
         $ar = getBigNumArray();  
         $i = 0;  
         foreach ($ar as $element) {  
      		$hash[$element] = $i++;  
         }  
      return $hash;  
      }  
        
      function getNumberFromString($str) {  
      # gibt die dezimale Entsprechung der (ganzen, positiven) Zahl aus dem beliebigen Zahlensystem zurück  
      	$hash = getBigNumHash();  
      	$number = 0;  
      	$length = strlen($str);  
      	for ( $i=$length; $i>0; $i-- ) {  
      		$inv = $length-($i);  
      		$char = $str{($i-1)};  
      		if ($hash[$char] != 0) {  
      			$add = pow(count($hash) ,$inv) * ($hash[$char]);  
      		} else {  
      			$add = 0;  
      		}  
      		$number = $number + $add;  
          }  
      return $number;  
      }  
        
        
      function getStringFromNumber($int) {  
      # gibt die Entsprechung aus dem beliebigen Zahlensystem für die eine positive, ganzzahlige Dezimalzahl zurück  
      	$ar = getBigNumArray();  
      	$length = count($ar);  
      	$str = '';  
      	$positions = 0;  
      	while ( pow($length, ($positions)) <= $int ) {  
      		$positions++;  
      	}  
      	$int;  
      	for ( $i=$positions; $i>0; $i-- ) {  
      		$potenz = pow($length, $i-1);  
      		$pos = floor($int / $potenz);  
      		$int = $int % $potenz;  
      		$str = $str . $ar[$pos];  
      	}  
      return $str;  
      }  
      ?>  
      
      

      MFFG (Mit freundlich- friedfertigem Grinsen)

      fastix

      1. Hi!

        function getBigNumHash() {

        kehrt den Array um. Es entsteht ein Hash

        $ar = getBigNumArray();
           $i = 0;
           foreach ($ar as $element) {
        $hash[$element] = $i++;
           }
        return $hash;
        }

        Du bist vermutlich so schnell im Tippen, dass es für dich kürzer ist, eine solche Funktion zu schreiben, als array_flip() im Handbuch zu finden. Der Kommentar ist auch nicht grad sehr erklärend. Umkehren wäre für mich, die Reihenfolge der Elemente zu ändern. Was du machst, ist jedoch letzten Endes ein Tausch von Schlüssel und Wert, auch wenn du den neuen Schlüssel selbst hochzählst.

        Lo!

        1. Moin!

          Was du machst, ist jedoch letzten Endes ein Tausch von Schlüssel und Wert, auch wenn du den neuen Schlüssel selbst hochzählst.

          Das ist genau was ich an der Stelle brauche. Oder anders:

          (1) Es gibt eine "vorgefertigte" Funktion. Die mag dokumentiert sein, erscheint mir aber zweifelhaft oder ich müsste nachlesen.(2)  Es gibt die Möglichkeit binnen Sekunden (ja ich bin manchmal schnell) einen "Dreizeiler" zu tippen, der mit wenigen mir bestens bekannten und primitiven Funktionen oder Algorithmen auskommt, dabei nicht mal viel Rechenzeit verbraucht und mit absoluter Sicherheit genau zu dem benötigten Ergebnis führt.

          Was werde ich wohl tun? Eine halbe Stunde lang Handbuch wälzen und Kopfschmerztabletten fressen oder einfach losschreiben? Um ganz ehrlich zu sein ist mir im konkreten Fall sogar die Zeit für die Abschätzung zu schade.

          MFFG (Mit freundlich- friedfertigem Grinsen)

          fastix

          1. Moin!

            Was du machst, ist jedoch letzten Endes ein Tausch von Schlüssel und Wert, auch wenn du den neuen Schlüssel selbst hochzählst.

            Das ist genau was ich an der Stelle brauche. Oder anders:

            (1) Es gibt eine "vorgefertigte" Funktion. Die mag dokumentiert sein, erscheint mir aber zweifelhaft oder ich müsste nachlesen.(2)  Es gibt die Möglichkeit binnen Sekunden (ja ich bin manchmal schnell) einen "Dreizeiler" zu tippen, der mit wenigen mir bestens bekannten und primitiven Funktionen oder Algorithmen auskommt, dabei nicht mal viel Rechenzeit verbraucht und mit absoluter Sicherheit genau zu dem benötigten Ergebnis führt.

            Was werde ich wohl tun? Eine halbe Stunde lang Handbuch wälzen und Kopfschmerztabletten fressen oder einfach losschreiben? Um ganz ehrlich zu sein ist mir im konkreten Fall sogar die Zeit für die Abschätzung zu schade.

            Dreizeiler?

              
            function getBigNumHash() {  
               return array_flip(getBigNumArray());  
            }
            

            Mit der Lupe vielleicht. ;)

            Native Array-Funktionen sind immer schneller, als ausprogrammierter Code. Also entweder weiß man, dass es so eine Funktion gibt, oder nicht. Kenn man sie, wird man sie nutzen wollen, andernfalls steckt man Gehirnschmalz in etwas, was man schneller hätte haben können, wenn man mal das Handbuch konsultiert hätte.

            Und selbst dann: Warum inkrementierst du ein $i? Warum verwendest du nicht den Key des Arrays? Wenn du schon dieser einen internen Funktion misstraust, solltest du der anderen Funktion, nämlich array() eigentlich auch misstrauen.

            - Sven Rautenberg

            1. Moin!

              andernfalls steckt man Gehirnschmalz in etwas, was man schneller hätte haben können, wenn man mal das Handbuch konsultiert hätte.

              Naja. Das für den konkreten eigenen Dreizeiler erforderliche Hirnschmalz ist eher als homeopatische Dosis anzusehen. Handbuch konsultieren und nach einer passenden Array-Funktion zu suchen hätte bei meinem Einsatzzweck länger gedauert als wohl jemals durch Verwendung der Fertigfunktion an Rechenzeit gespart wird. Es sei denn wir führen wieder Prozessoren mit 8kHz ein.

              Warum inkrementierst du ein $i? Warum verwendest du nicht den Key des Arrays?

              $i++ ist doch was solides. Und angeblich rasend schnell!

              Also entweder weiß man, dass es so eine Funktion gibt, oder nicht.

              Heute würde ich in der konkreten Implementierung auch array_flip() nehmen. Als ich das schrieb war ich noch jung, kannte primitive Programmiersprachen wie BASIC und brauchte fix ein Ergebnis. Insoweit hast Du natürlich recht.

              Ach ja: manche Fertigfunktionen habe manchmal ein paar Abhängigkeiten zu viel...

              MFFG (Mit freundlich- friedfertigem Grinsen)

              fastix

    3. Duerfte ich noch bemerken, dass man durch senden eines entsprechenden Http Response Codes Google und andere Suchmaschinen darauf aufmerksam machen kann das die Resource weg (GONE?) ist bzw nicht vorhanden (404??).

      Mache ich längst:

      if ( $row_trm )  
      {  
        header('content-type: text/html; charset=utf-8');  
      }  
      else  
      {  
        header("HTTP/1.0 410 Gone");  
      //header("HTTP/1.0 404 Not Found");  
      }  
      
      

      Wirkt aber nur, wenn die Seite **nach** dem Löschen besucht wird.

      1. du koenntest dazu noch einen Expires Header mitgeben, der wird von Google evt. auch entsprechend beruecksichtigt?

  5. Hello,

    in einer Tabelle speichere ich Termine, die nach Überschreitung des Datums gelöscht werden.

    Ich war immer so stolz auf die extrem kurzen Links, doch nun ist die ID im fünfstelligen Bereich und ich möchte die Lücken wieder nutzen.

    Irgendwo war hier mal eine Diskussion, sowas auf keinen Fall zu tun, weil das Internet ja nichts vergisst und ur-uralte Links dann auf den falschen Termin verweisen. Sollen sie doch. Ich bin nicht dafür verantwortlich, wenn Google & Co längst nicht mehr erreichbare Seiten jahrelang als Leichen führen.

    Also, wie finde ich die erste Lücke? Ich freue mich schon auf zwei- und dreistellige IDs.

    Pfui, schäm Dich. Du hast noch nicht die Forumssuche bentuzt, denn sonst hättest Du gefunden:

    http://forum.de.selfhtml.org/archiv/2011/5/t205243/#m1391008
    und ca. 100 andere zum Thema "Lücken finden"...

    Liebe Grüße aus dem schönen Oberharz

    Tom vom Berg

    --
     ☻_
    /▌
    / \ Nur selber lernen macht schlau
    http://bergpost.annerschbarrich.de
  6. Hi,

    Ich war immer so stolz auf die extrem kurzen Links, doch nun ist die ID im fünfstelligen Bereich

    hexadezimal ist sie vermutlich im vierstelligen Bereich, und bei einem Zahlensystem der Basis (z.B.) 64 vielleicht drei- oder sogar zweistellig.

    und ich möchte die Lücken wieder nutzen.

    Nein, die massive Vielzahl der damit verbundenen Probleme möchtest Du Dir wegen eines dermaßen unwichtigen Details definitiv nicht aufhalsen.

    Irgendwo war hier mal eine Diskussion, sowas auf keinen Fall zu tun, weil das Internet ja nichts vergisst und ur-uralte Links dann auf den falschen Termin verweisen.

    Dieses spezielle Problem ist vergleichsweise sogar egal.

    Also, wie finde ich die erste Lücke?

    Im Idealfall nicht.

    Cheatah

    --
    X-Self-Code: sh:( fo:} ch:~ rl:| br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
    X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
    X-Will-Answer-Email: No
    X-Please-Search-Archive-First: Absolutely Yes
  7. Habe eure Bedenken gelesen.

    Statt Termine zu löschen, könnte ich ein Lösch-Datum setzen und - sagen wir nach mindestens einem Jahr - Sätze mit dem kleinsten Löschdatum wiederverwenden.

    1. Statt Termine zu löschen, könnte ich ein Lösch-Datum setzen und - sagen wir nach mindestens einem Jahr - Sätze mit dem kleinsten Löschdatum wiederverwenden.

      Nee, nicht zuende gedacht. Dann wären ja auch die 5-stelligen IDs nach einem Jahr wieder dran.

      Ich muss natürlich von den mindestens einjährig gelöschten den mit der kleinsten ID nehmen.

      1. Nee, nicht zuende gedacht. Dann wären ja auch die 5-stelligen IDs nach einem Jahr wieder dran.

        Ich muss natürlich von den mindestens einjährig gelöschten den mit der kleinsten ID nehmen.

        Und ein zweiter Anwender findet dann auch gerde diese ID.

        Ich lasse es, wie es ist.

        Gast