strikte Ordnung

Der MySQL Datenbank-Server für Internet- und Intranet-Lösungen.

strikte Ordnung

Beitragvon Rene » So 25 Aug, 2002 11:18

Ich habe eine Tabelle mit den Spalten id, kategorie, artikel, ordnung. Ich möchte nun eine strikte Ordnung auf Datensätze derselben Kategorie definieren. Das heißt, ich nummeriere alle Datensätze derselben Kategorie, in der Spalte ordnung, von 0 – n durch. Soweit ok, ändere ich jetzt aber die Kategorie eines Datensatzes, so kann es passieren, dass es nun für diese Kategorie zwei gleiche Werte in der Spalte ordnung gibt. Wie kann ich in der UPDATE-Anweisung die Ordnung für eine Kategorie neu aufbauen? Gibt es eine Funktion, die mir einen Autoincrement-Wert liefert? Oder gibt es eine andere Lösung für mein Problem?

mfg Rene
Rene
 

RE: strikte Ordnung

Beitragvon mad » So 25 Aug, 2002 17:05

die frage ist, wozu du so ein - informationstechnisch gesehen relativ redundantes -
feld wie "ordnung" in der db ablegst .. wie waers wennst einfach die db-selbst
"ordnen" laesst?

zb.
select * from table where kategorie=17 order by artikel

oder

select * from table order by kategory, artikel

andernfalls wirst ein problem bekommen,
denn dann musst halt applikaitionsseitig bei allen anderen datensaetze
ordnung+1 auslesen und ein update machen ...

sicher wahnsinnig effizient bei ein paar tausend eintraegen ...
mal ganz abgsehen von den problemchen (datenkonsistenz) die auftreten,
wenn mehr als eine client-applikation so ein update macht ..

mad.
mad
 

RE: strikte Ordnung

Beitragvon Rene » Mo 26 Aug, 2002 08:57

Hi mad,

eine strikte Ordnung in den Datensätzen würde mir helfen Datensätze nach meinen eigenen Vorstellungen zu sortieren. Ich habe eine Reihe von Artikeln, die sich in unterschiedlichen Kategorien befinden können. Die Artikel sollen von der Anordnung frei sein, das heißt, sie können beliebig die Kategorie wechseln und die Reihenfolge soll ebenfalls frei wählbar sein. Momentan ordne ich sie nach einem Timestamp. Das garantiert mir, dass die neusten oben sind. Nun möchte ich sie aber in der Reihenfolge beliebig verschieben können. Zum Anfang oder eins vor oder eins weiter oder zum Ende. Eine strikte Ordnung würde mir dabei helfen, denn dann würde ich alle Artikel in einer Kategorie durchnummerieren. Möchte ich die Reihenfolge ändern, so brauche ich bloß zwei UPDATE-Anweisungen, nämlich die zum Ordnungsnummern vertauschen. INSERT ist auch einfach, ich müsste nur bei alle Artikel, die einer Kategorie zugeordnet sind, die Ordnungsnummern um 1 inkrementieren und den neuen Artikel die Ordnungsnummer 0 geben. Löschen ist ebenfalls trivial. Alle Ordnungsnummern, die größer sind als die zu löschende, werden um eins verringert. Nur bei dem Wechseln von einer Kategorie zur einer anderen habe ich Probleme, da es passieren kann, dass zwei gleiche Ordnungsnummern existieren. Ich müsste sie neu durchnummerieren. Und das ist mein Problem. Eine Möglichkeit wäre es über php machen zu lassen. Man würde sich alle betroffenen Datensätze ausgeben lassen und diese einzeln durch eine UPDATE-Anweisung ändern. Hier ist mir aber der lineare Aufwand o(n) viel zu hoch. Es wäre schön, wenn man es in einer UPDATE-Anweisung pressen könnte.

Rene
Rene
 

RE: strikte Ordnung

Beitragvon mad » Mo 26 Aug, 2002 22:58

hallo rene,

> eine strikte Ordnung in den Datensätzen würde mir helfen Datensätze nach meinen eigenen Vorstellungen zu sortieren.

ok .. argument.

> Hier ist mir aber der lineare Aufwand o(n) viel zu hoch. Es wäre schön, wenn man es in einer UPDATE-Anweisung pressen könnte.

hm .. ich fuerchte da wird dir die db nicht sonderlich helfen koennen ... selbst wenn
du alles in ein logisches update bringst, aendert das nichts an der tatsache,
dass die db intern (physisch) alle entsprechenden datensaetze updaten muss
ergo wieder, wie du ja schon festgestellt hast, linearer aufwand o(n) ...

irgendwo manipulierst du ja da daten in form eines arrays .. wie waers ...
mal rein hypothetisch gesprochen ... wenn du die ordnung der artikel in
einem extra table in form einer doppelt verketteten liste ablegst
(node_id, parent_id, child_id) .. damit waeren die insert, delete operationen
mal sicher was mit o(1) ..

.. nur halt die ausgabe der daten (zumindest in der entsprechenden reihenfolge)
duerft dann wohl ziemlich indisktuabel langsam werden ... hm ..
ein echt verzwicktes problem ...

da muesst ma ja glatt informatik studiert ham :-))
... lass es uns wissen, wenn du ne loesung gefunden hast ...

mfg,
mad.
mad
 

RE: strikte Ordnung

Beitragvon Rene » Di 27 Aug, 2002 09:00

Hi,

die doppelt verkettete Liste klingt gut. Aber nach langen überlegen, ist mir aufgefallen, dass ich nun die Datensätze schön verkettet habe. Das heißt ich könnte mich von oben nach unten durchhangeln, aber sortieren in Form einer ORDER-Klausel kann ich immer noch nicht. Es fehlt immer noch eine Ordnung.
Ein Freund hat mich nun auf die Idee gebracht, Kategoriewechsel wie normale DELETEs und anschließenden INSERTs zu behandeln. Das kann ich in vier SQL-Abragen realisieren. Damit bin ich wieder bei O(1), jedenfalls auf der Applikationsseite, und mein Problem dürfte damit gelöst sein.

Danke für die Mühe!

René

PS: Ich studiere gerade Informatik
Rene
 


Zurück zu MySQL

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 5 Gäste