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 2 Gäste