oggy: nummerieren von datensätzen

moin,

hier das problem:

ich habe eine datenbank in der die filenamen von bilder gespeichert werden. da die reihenfolge der bilder bei der ausgabe aber wichtig ist sind die bilder von 1,... durchnummeriert.

der user hat die möglichkeit bilder an bestimmten positionen einzufügen, zu tauschen und zu löschen.
da der user aber mehrere files gleichzeitig löschen kann entstehen dann im meiner durchnummerierung lücken.

bisher löse ich das so:

'select name,pos from ... order by pos desc' dann gehe ich mit php das ganze array durch und setze die pos-zahlen mit 'update ... set pos=posneu where pos=posalt' für jeden datensatz neu. das ist aber nicht besonders elegant, oder? ;-)

und jetzt die frage:

nach dem löschen habe ich also lücken in meiner fortlaufenden zählung der datensätze, ich brauche aber eine zählung ohne lücken, wie geht das einfacher oder besser nur mit hilfe von sql?

  1. Sup!

    Ich verstehe erstmal nicht, warum die Bilder unbedingt auf Datenbankebene diese Durchnummerierung haben müssen.

    Wenn Du Dir nachher einen Array von Bildern gegen lässt oder mit einem Cursor durch die DB läufst, kannst Du doch auf der Ebene der zugreifenden Programmiersprache neue durchlaufende Nummern vergeben?

    Gruesse,

    Bio

    --
    Besucht den Adventskalender!
    http://selfcommunity.teamone.de/advent/2003/
    1. Hi,

      » Ich verstehe erstmal nicht, warum die Bilder unbedingt auf Datenbankebene diese Durchnummerierung haben müssen.

      ich auch nicht. Hier liegt wieder vermutlich der Fall vor, dass fuer irgendwelche Auswertungszwecke vermeintlich ein fortlaufender Zaehler (Index) benoetigt wird. - Wieder mein Hinweis an dieser Stelle, dass man zum Bilden von Eindeutigkeiten Datenfelder nutzen sollte, die keine weitere Bedeutung haben, als die Eindeutigkeit zu sichern.

      Gruss,
      Lude

      1. ...

        nachplappern und vermutungen anstellen die jeder grundlage entbehren ist nicht sonderlich produktiv...

        gruß oggy

    2. Sup!

      Ich verstehe erstmal nicht, warum die Bilder unbedingt auf Datenbankebene diese Durchnummerierung haben müssen.

      hi,

      die nummerierung gibt an in welcher reihenfolge die bilder angezeigt werden sollen!

      und die datenbank gibt die datensätze nicht in der reihenfolge aus in der ich sie eingebe. schon gar nicht wenn der user die möglichkeit hat bilder an bestimmten stellen einzufügen, bestehende bilder in der position zu tauschen und auch bilder zu löschen.

      wie soll ich die reihenfolge sonst speichern, wenn nicht in einer positionsnummer? (wenn es doch geht: wie?)

      da die bilderarchive sehr umfangreich werden können und ständig aktualisiert werden bin ich hier eben an einer lösung in reinem sql interessiert...

      gruß oggy...

      1. Hi,

        die nummerierung gibt an in welcher reihenfolge die bilder angezeigt werden sollen!

        die Nummerierung bestimmt in welcher Reihenfolge die Bilder angezeigt werden sollen, d.h. eine fortlaufende Nummerierung ist schlichtweg nicht notwendig und wie Du selbst erfahren hast, in diesem Fall auch nicht zweckmaessig.

        Da Du das nicht zu verstehen scheinst, ein kleines Beispiel: Bilder Nummer '1', '3', '4', '6', '7' gefunden => Beim Anzeigen werden die Bilder ansteigend sortiert nach 'Nummer' ausgegeben. Die umgebende Programmlogik generiert beim Durchlaufen der vom Datenserver erhaltenen Daten ggf. einen fortlaufenden Index, falls dieser benoetigt wird.

        <bio_schlecht_imitierend>
        Du undankbarer Wurm!
        </bio_schlecht_imitierend>

        Gruss,
        Lude

        1. hi,

          Da Du das nicht zu verstehen scheinst, ein kleines Beispiel: Bilder Nummer '1', '3', '4', '6', '7' gefunden => Beim Anzeigen werden die Bilder ansteigend sortiert nach 'Nummer' ausgegeben.

          für die anzeige der bilder hast du recht, aber wie fügst du ein bild zwischen pos 2 und 3 ein? wohl so:

          (pseudocode)
          list = select name,pos from images order by pos asc;
          update images set pos=pos+1 where pos>list[nr2].pos;
          insert into images (name,pos) values (newname,list[nr3].pos);

          die erste zeile kann ich mir aber sparen, wenn die nummerierung FORTLAUFEND ist. pos ist mein index über den ich direkt auf die namen der bilder an pos zugreifen kann ohne vorher die ganze datenbank in einem array speichern zu müssen um rauszufinden wie das bild an position pos heißt!

          ich habe 3 funktionen:

          1. insert(pos,name) // name nach pos einfügen

          2. change(pos1,pos2)// selbsterklärend

          3. delete(list)     // alle positionen in list löschen

          4. und 2) werden mit abstand am häufigsten aufgerufen also sollen sie auch so schnell wie möglich sein was ich aber nur mit einem fortlaufenden index garantieren kann. 3) wird selten aufgerufen also kann sie etwas zeitaufwendiger sein...

          so und jetzt kommst du...

          gruß, der undankbare Wurm!

          1. Hi,

            ich habe 3 funktionen:

            1. insert(pos,name) // name nach pos einfügen

            2. change(pos1,pos2)// selbsterklärend

            3. delete(list)     // alle positionen in list löschen

            4. und 2) werden mit abstand am häufigsten aufgerufen also sollen sie auch so schnell wie möglich sein was ich aber nur mit einem fortlaufenden index garantieren kann. 3) wird selten aufgerufen also kann sie etwas zeitaufwendiger sein...

            ich gebe zu, dass ich Deine Anforderung moeglicherweise erst jetzt verstehe. Fuer meine bisherigen nicht wirklich zielfuehrenden Antworten bitte ich dementsprechend um Nachsicht.

            Fassen wir also mal zusammen: Wir haben einen anfangs fortlaufenden Zaehler mit Verweisen auf die Dateipfade. Hauptproblem: Wir wollen ein Bildchen "in der Mitte" einfuegen.

            Ich denke da an meine Zeiten als Basic(und Cobol)-Programmierer. Da gab es diese Zeilennummerierungen und man war gehalten mit '10', '20', '30' und so weiter zu nummerieren, weil ja ggf. noch Programmzeilen eingefuegt werden muessen. - Zugegebenerweise ein bauernschlauer Loesungsansatz, aber doch wesentlich ueberzeugender als eine immer neue Reorganisation des "Index"? Ich denke, dass ja.
            Allerdings hat man doch ein flaues Gefuehl dabei, denn die Idealloesung ist es offensichtlich nicht. - Wenn wir mal davon ausgehen, dass die zu manipulierende Datenstruktur eine (logisch) verzeigerte Liste ist, dann haben wir auch schon eine andere Loesung: Du kannst beim "Bild-Insert" genau zwei Datensaetze manipulieren und zwar den Neuen schreiben (soll auf den ermittelten "Nachfolger" zeigen) und den "Vordermann" umhaengen (der soll jetzt auf den neuen zeigen). (Dummerweise haettest Du dann beim Lesen beispielsweise aller Datensaetze das Problem, dass Du sehr viele Queries absenden muesstest.) - Wie macht das eigentlich 'CK' hier im Forum? (Das Problem scheint mir aehnlich gelagert zu sein.)

            Nun zur Frage, ob man das alles "in SQL" durchfuehren kann, was ja bekanntlich fuer bestimmte Anforderungen attraktiv erscheint. Ich glaube ja, und zwar genau dann, wenn der SQL-Dialekt ueber eine Programmflusskontrollsprache verfuegt. Beispielsweise bei 'T-SQL' (Micro$oft) ist das der Fall. Dann kann man (fast alles) was die umgebende Programmlogik so treibt auch "in SQL" machen.

            Gruss,
            Lude,

            --
            "Fuer Fragen rund um die IT stets kostenfrei verfuegbar."

            1. hi,

              nachsicht wird gewährt ;-) ... passiert mir hier im forum aber öfter, daß ich auf konkrete fragen zu einem meiner probleme sehr unüberlegte antworten bekomme.

              aber egal, schönen tag gruß oggy

              ps: schöne feiertage und nen guten rutsch...

              1. Hi,

                nachsicht wird gewährt ;-) ... passiert mir hier im forum aber öfter, daß ich auf konkrete fragen zu einem meiner probleme sehr unüberlegte antworten bekomme.

                immerhin will man Dir helfen. - Ich habe noch etwas meditiert, warum ich Deine Frage nicht verstanden habe und bin auf folgendem Satz aus Deinem ersten Beitrag gestossen: 'nach dem löschen habe ich also lücken in meiner fortlaufenden zählung der datensätze, ich brauche aber eine zählung ohne lücken, wie geht das einfacher oder besser nur mit hilfe von sql.' (Einen Satz, den ich auch heute nicht verstehe.)

                Wie hast Du das Problem uebrigens geloest? Oder wie analysierst Du es?

                Gruss,
                Lude

                ---
                "Ostern kommt nach Weihnachten."

                1. Hi,

                  immerhin will man Dir helfen.

                  Das fällt mir manchmel aber echt schwer zu glauben. ein paar der moderatoren hier legen manchmal schon ein saumäßiges verhalten an den tag. da wird stur auf meinungen beharrt die aber durchaus noch verbesserungsfähig sind. ich sag da nur daß lösungen für ein intranet andere anforderungen haben als lösungen fürs internet (browserkompatibilität)...

                  Ich habe noch etwas meditiert, warum ich Deine Frage nicht verstanden habe und bin auf folgendem Satz aus Deinem ersten Beitrag gestossen: '... wie geht das einfacher oder besser nur mit hilfe von sql.'

                  hierfür bitte ich um nachsicht, aber ist nicht immer leicht ein problem mit dem man sich schon eine weile befasst hat für andere verständich zu machen. man läßt wesentliche sachen weg die einem logisch erscheinen, die für das verständnis aber wichtig wären.

                  Wie hast Du das Problem uebrigens geloest? Oder wie analysierst Du es?

                  so treibe ich meinem index die lücken aus...

                  $i=1;
                  $result=mysql_query("select pos from impressionen where uid='$uid' order by pos asc");
                  while($row=mysql_fetch_array($result,MYSQL_ASSOC)){
                    mysql_query("update impressionen set pos='$i' where uid='$uid' and pos='".$row['pos']."'");
                    $i++;
                  }

                  das ist meine lösung, ich habe eine schleife in der für jedes bild in der datenbank das array:$row erzeugt und wieder gelöscht wird, wahrlich nicht besonders effizient.

                  Wie ich es analysiere? ich bin studierter mathematiker und programmiere seid fast 15 jahren in c/c++/assembler mit schwerpunkt algorithmen-analyse, da habe ich einfach ein feeling für effizienz. und mein feeling sagt mir daß die löschen funktion nicht toll ist weil ich den umweg über php schleifen und arrays nutze. ich habe den datentransfer vom mysql-server zum php-server und zurück (die server befinden sich an verschiedenen stellen!!!) und das kostet zeit. um diesen transfer zu umgehen müsste man die löschenfunktion auf dem sql-server laufen lassen, was aber nur geht wenn sie nur aus sql-statements bestehen würde, was genau das ist was ich suche. leider bin ich nur mit den einfachen grundlagen von sql vertraut die aber nicht ausreichen um mein problem zu lösen, deshalb meine frage nach einer lösung in reinem sql...

                  hoffe mein prob ist nun besser erklärt. ;-)

                  gruß oggy

                  oder: "Weihnachten kommt nach Ostern." (verstehe nicht ganz was du meinst)

                  1. Hi,

                    das ist meine lösung, ich habe eine schleife in der für jedes bild in der datenbank das array:$row erzeugt und wieder gelöscht wird, wahrlich nicht besonders effizient.

                    in der Tat nicht.

                    Wie ich es analysiere? ich bin studierter mathematiker und programmiere seid fast 15 jahren in c/c++/assembler mit schwerpunkt algorithmen-analyse, da habe ich einfach ein feeling für effizienz. [...]

                    Prima. Was haeltst Du denn von meinen beiden gemachten Vorschlaegen?

                    hoffe mein prob ist nun besser erklärt. ;-)

                    Absolut, wir Nichtmathematiker brauchen da manchmal etwas laenger beim Verstaendnisprozess. (Ich meine, dass es mit MySQL keine schoene Loesung gibt; eventuell mal umsatteln.)

                    Gruss,
                    Lude