Sven Rautenberg: MySQL: Workaround für NEXT und PREVIOUS gesucht

Beitrag lesen

Moin

Stell Dir mal folgendes vor:

[...]

Wir blättern also nicht dadurch, daß wir uns die Vorgängerposition
   merken - wir "verbrauchen" einfach alle Datensätze mit gelöschtem
   Flag! Dabei ist uns völlig egal, ob neue Datensätze hinzu kommen -
   wenn wir beispielsweise beim Buchstaben N sind und ein neuer Name
   mit A eingetragen wird, dann bekommt der Bearbeiter als nächsten
   Datensatz diesen angeboten, weil er ja nun der kleinste "ungeflagte"
   ist.
Auf diese Weise werden definitiv alle Datensätze sequentiell bearbeitet

  • zwar nicht zwingend in alphabetischer Reihenfolge ihrer Namen, aber
    so gut wir möglich.

Tja, die Frage ist dabei aber nur: Ist das genau das, was man will?

Zum einen: Wenn ich alphabetisch sortiert blättern will, dann kann ich es nicht gebrauchen, daß nach "Neumann" plötzlich "Adelbert" kommt, nur weil der gerade neu ist. Das ist nicht mein Begriff von "blättern".

Und wenn deine Lösung garnicht alphabetisches Blättern heißt: Wenn man einfach aufsteigend nach der unique ID sortiert, kommen neue Datensätze immer ans Ende, tauchen aber nie zwischendrin auf.

Die Probleme kommen, ganz klar, dann, wenn man nur einen Teilausschnitt aus dieser Tabelle betrachten will, beispielsweise alle Datensätze mit Namen "N".

Es muß einfach die Entscheidung getroffen werden, daß entweder das alphabetische beim Blättern wichtig ist, oder die Beachtung aller im Laufe des Blätterns neu hinzukommenden Datensätze. Dabei ist ganz eindeutig der gewünschte Arbeitsvorgang mit zu berücksichtigen.

Ich kann mir eigentlich nur zwei Szenarien vorstellen: Erstens geht es um ein zwangloses Blättern, bei dem man an gewissen Stellen auch Datensätze bearbeitet. Derselbe Vorgang des Bearbeitens wäre auch durchführbar, wenn man den Datensatz direkt sucht (also nach ID oder Namen) und bearbeitet. Das Blättern würde in diesem Falle eigentlich nur aufhalten, bzw. das Anzeigen einer blätterbaren Auswahlliste die Auswahl des richtigen Datensatzes erleichtern, wenn man dessen eindeutige ID nicht kennt, sondern nur "Neumann, Peter".

Andererseits gibt es Arbeiten, die zwingenderweise für alle vorhandenen Datensätze ausgeführt werden müssen. Das wird man aber sinnvollerweise nicht per "Blättern" erledigen, sondern sich anhand der ID durcharbeiten. Da ist es dann garkein Problem, das blockweise zu machen und beispielsweise je 10.000 IDs zu verarbeiten (0-9.999, dann 10.000 bis 19.999) und sich nur zu merken, wie weit man gekommen ist. Neue Datensätze kommen immer nach hinten.

Deine Lösung mit Flags bedeutet, daß du das "hinten" selbst definierst und für jeden Datensatz definierst, daß er sich entweder "dahinter" oder "davor" befindet, gesehen von dem Ort, an dem man sich in der Datenbank gerade befindet. Dadurch, daß du während des Blätterns diese Flags ändern mußt, hast du nochmal zusätzlich den Aufwand, in die Datenbank zu schreiben. Und das halte ich eigentlich für unnötigen Zusatzaufwand.

Über Performance brauchen wir uns übrigens noch garnicht zu unterhalten, solange das Problem nicht ursächlich gelöst wurde. Daß es für alle Dinge irgendeine Index-Lösung gibt, ist klar. Das ist aber nur ein Nebeneffekt.

- Sven Rautenberg