[gelöst] Todo Priorität in Datenbank günstig definieren
[gelöst] Todo Priorität in Datenbank günstig definieren
Hallo werte Diskutanten,
ich hätte da mal eine Designfrage.
In einem datenbankbasiertem Programm habe ich eine Art ToDo-Tabelle. Darin trage ich zu erledigende Aufgaben ein. Jetzt kommen regelmäßig neue Aufgaben hinzu und alte werden entfernt bzw. als erledigt markiert. Manche neu hinzukommende Aufgaben sind unverzüglich zu erledigen, andere haben keine zeitliche Präferenz. Die Aufgaben, die unverzüglich erledigt werden sollen, möchte ich gern am Anfang einer Ausgabe (in einer Tabelle) stehen haben.
Zur Zeit habe ich neben der ID, die die Aufgabe eindeutig identifiziert, eine PräferenzID, die die Dringlichkeit einer Aufgabe definiert. Allerdings muss ich nun bei jeder Aufgabe, die neu hinzukommt und am dringlichsten erledigt werden muss, alle bisherigen Aufgaben nach hinten rücken. Das funktioniert soweit auch gut, nur frage ich mich, ob es dafür nicht eine bessere Lösung gibt, als alle in der Datenbank vorhandenen Aufgaben anzufassen und zu verschieben (PräferenzID erhöhen).
Wie würdet ihr so etwas lösen?
ich hätte da mal eine Designfrage.
In einem datenbankbasiertem Programm habe ich eine Art ToDo-Tabelle. Darin trage ich zu erledigende Aufgaben ein. Jetzt kommen regelmäßig neue Aufgaben hinzu und alte werden entfernt bzw. als erledigt markiert. Manche neu hinzukommende Aufgaben sind unverzüglich zu erledigen, andere haben keine zeitliche Präferenz. Die Aufgaben, die unverzüglich erledigt werden sollen, möchte ich gern am Anfang einer Ausgabe (in einer Tabelle) stehen haben.
Zur Zeit habe ich neben der ID, die die Aufgabe eindeutig identifiziert, eine PräferenzID, die die Dringlichkeit einer Aufgabe definiert. Allerdings muss ich nun bei jeder Aufgabe, die neu hinzukommt und am dringlichsten erledigt werden muss, alle bisherigen Aufgaben nach hinten rücken. Das funktioniert soweit auch gut, nur frage ich mich, ob es dafür nicht eine bessere Lösung gibt, als alle in der Datenbank vorhandenen Aufgaben anzufassen und zu verschieben (PräferenzID erhöhen).
Wie würdet ihr so etwas lösen?
Zuletzt geändert von Michl am Mo 19. Okt 2015, 21:48, insgesamt 1-mal geändert.
Code: Alles auswählen
type
TLiveSelection = (lsMoney, lsChilds, lsTime);
TLive = Array[0..1] of TLiveSelection;
-
- Beiträge: 152
- Registriert: Mo 3. Feb 2014, 14:07
- OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
- CPU-Target: xxBit
Re: Todo Priorität in Datenbank günstig definieren
Ohne viel ändern zu müssen, könntest du die IDs mit 100, 200, 300.... definieren, also mit genug Luft dazwischen um IDs davor oder dazwischen schieben zu können.
.
Re: Todo Priorität in Datenbank günstig definieren
Ich würde ein Feld mit Zeitstempel (Erstellung des Datensatzes) in der Tabelle aufnehmen und dann die jeweils neuesten Einträge einer Priorität zuvorderst anzeigen.
19.10.2015 Priorität 1
12.10.2015 Priorität 1
10.10.2015 Priorität 1
19.10.2015 Priorität 2
...
19.10.2015 Priorität 1
12.10.2015 Priorität 1
10.10.2015 Priorität 1
19.10.2015 Priorität 2
...
Re: Todo Priorität in Datenbank günstig definieren
Beide Ansätze stellen sicherlich eine mögliche Verbesserung dar. Allerdings (was ich oben noch nicht schrieb und um die Aufgabe etwas schwieriger zu gestalten
) soll der User die Tabelle auch bearbeiten können. D.h., wenn z.B. eine schon vorhandene unerledigte Aufgabe aus irgend einem Grund noch dringlicher wird, muss er sie nach vorn bzw. auch nach hinten rücken können.
Dazu nutze ich zur Zeit die Möglichkeit per Drag and Drop die Aufgabe in der Tabelle zu verschieben (nach vorn, sowie nach hinten).
Um eine Aufgabe mit gleicher Priorität in der Tabelle zu verschieben, müsste man immer ein Zeitstempel zwischen dem Vorgänger und dem Nachfolger ermitteln und diesem der zu verschiebenden Aufgabe zuweisen.
Danke für die Ansätze!
Hat noch jemand einen alternativen Vorschlag oder Hinweis?

Dazu nutze ich zur Zeit die Möglichkeit per Drag and Drop die Aufgabe in der Tabelle zu verschieben (nach vorn, sowie nach hinten).
Rein statistisch gesehen kommen mehr Aufgaben mit Prio 1 hinzu, als mit höherer Priorität. D.h., ist einmal Prio 100 gesetzt, kann ein neuer Eintrag mit z.B. Prio 50 oder 99 gesetzt werden, nächster Eintrag mit Prio 25 oder 98 usw. Irgendwann, falls die Aufgaben nicht schneller erlegt werden, als neue hinzugefügt werden, ist ebenfalls kein Platz mehr. Dann muss die Tabelle wieder (teilweise) neu sortiert werden (evtl. in 100er Schritten).baumina hat geschrieben:Ohne viel ändern zu müssen, könntest du die IDs mit 100, 200, 300.... definieren, also mit genug Luft dazwischen um IDs davor oder dazwischen schieben zu können.
Das wäre die Lösung, wie ich sie bis dato bevorzugen würde. Man hätte den Vorteil, dass man keinerlei Verschiebungen in der Datenbank machen müsste und alles sauber mit einem entsprechendem Select ausgegeben bekommt.Achtzig hat geschrieben:Ich würde ein Feld mit Zeitstempel (Erstellung des Datensatzes) in der Tabelle aufnehmen und dann die jeweils neuesten Einträge einer Priorität zuvorderst anzeigen.
Um eine Aufgabe mit gleicher Priorität in der Tabelle zu verschieben, müsste man immer ein Zeitstempel zwischen dem Vorgänger und dem Nachfolger ermitteln und diesem der zu verschiebenden Aufgabe zuweisen.
Danke für die Ansätze!
Hat noch jemand einen alternativen Vorschlag oder Hinweis?
Code: Alles auswählen
type
TLiveSelection = (lsMoney, lsChilds, lsTime);
TLive = Array[0..1] of TLiveSelection;
-
- Beiträge: 179
- Registriert: Mi 2. Sep 2015, 11:09
- OS, Lazarus, FPC: Lazaurus 2.2.4 FPC 3.2.2
- CPU-Target: Windows 32/64bit
Re: Todo Priorität in Datenbank günstig definieren
Ich würde allerdings den ältesten Eintrag der gleichen Priorität oben anzeigen.Achtzig hat geschrieben:und dann die jeweils neuesten Einträge einer Priorität zuvorderst anzeigen.
19.10.2015 Priorität 1
12.10.2015 Priorität 1
10.10.2015 Priorität 1
19.10.2015 Priorität 2
...
10.10.2015 Priorität 1
12.10.2015 Priorität 1
19.10.2015 Priorität 1
13.10.2015 Priorität 2
19.10.2015 Priorität 2
Denn wenn die Priorität gleich ist, dann sollte doch zuerst die Aufgabe erledigt werden, welche schon älter ist und nicht die. welche gerade eben neu dazugekommen ist.
.
-
- Beiträge: 340
- Registriert: Di 12. Sep 2006, 08:57
- OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
- CPU-Target: xxBit
- Kontaktdaten:
Re: Todo Priorität in Datenbank günstig definieren
So:Michl hat geschrieben:Hallo werte Diskutanten,
ich hätte da mal eine Designfrage.
In einem datenbankbasiertem Programm habe ich eine Art ToDo-Tabelle. Darin trage ich zu erledigende Aufgaben ein. Jetzt kommen regelmäßig neue Aufgaben hinzu und alte werden entfernt bzw. als erledigt markiert. Manche neu hinzukommende Aufgaben sind unverzüglich zu erledigen, andere haben keine zeitliche Präferenz. Die Aufgaben, die unverzüglich erledigt werden sollen, möchte ich gern am Anfang einer Ausgabe (in einer Tabelle) stehen haben.
Zur Zeit habe ich neben der ID, die die Aufgabe eindeutig identifiziert, eine PräferenzID, die die Dringlichkeit einer Aufgabe definiert. Allerdings muss ich nun bei jeder Aufgabe, die neu hinzukommt und am dringlichsten erledigt werden muss, alle bisherigen Aufgaben nach hinten rücken. Das funktioniert soweit auch gut, nur frage ich mich, ob es dafür nicht eine bessere Lösung gibt, als alle in der Datenbank vorhandenen Aufgaben anzufassen und zu verschieben (PräferenzID erhöhen).
Wie würdet ihr so etwas lösen?
Code: Alles auswählen
SELECT * FROM Tabelle ORDER BY dringlichkeit, id
Grüße, Antrepolit
care only if your os is really burning
care only if your os is really burning
Re: Todo Priorität in Datenbank günstig definieren
Hallo,
ich habe es in dem Programm "MyMemoryDB" folgendermaßen gelöst:
( http://www.heise.de/download/mymemorydb-1189626.html ) Der Texteintrag hat in der Datenbank (SQLite) verschiedene Spalten. Eine davon ist quasi ein "Zeitstempel", der immer dann "aktualisiert" wird, wenn der Button
"Text markieren" gedrückt wird.
In das besagte Textfeld (=Datenbankspalte -> hier "T3") wird dabei das aktuelle Datum und die aktuelle Zeit in dieser Form
eingetragen mit diesem Befehl:
Die Ausgabe muss man dann nur noch sortiert nach dieser Spalte (T3) in einem Grid-Feld darstellen
Mit jedem neuen Eintrag wandern also die bereits vorhandenen Einträge "nach hinten". Drückt man aber erneut den Button "Text markieren", so erhält dieser Eintrag mit dem genannten "Update"-Befehl erneut das aktuellste Datum und steht somit wieder ganz "oben". Immer wenn also ein Texteintrag, der besonders wichtig ist, zu weit nach unten zu rutschen droht, genügt ein Klick auf den "Text markieren"-Button.
Mit einer "Präferenz-ID" könnte man dann ja jederzeit noch das Sortierergebnis "modifizieren".
Aliobaba
ich habe es in dem Programm "MyMemoryDB" folgendermaßen gelöst:
( http://www.heise.de/download/mymemorydb-1189626.html ) Der Texteintrag hat in der Datenbank (SQLite) verschiedene Spalten. Eine davon ist quasi ein "Zeitstempel", der immer dann "aktualisiert" wird, wenn der Button
"Text markieren" gedrückt wird.
In das besagte Textfeld (=Datenbankspalte -> hier "T3") wird dabei das aktuelle Datum und die aktuelle Zeit in dieser Form
Code: Alles auswählen
hhDatum := (FormatDateTime('yyyymmddtt', Now));
Code: Alles auswählen
QText.SQL.Text:= ' UPDATE tText SET T3 = :dat WHERE rID= :aID ';
Mit jedem neuen Eintrag wandern also die bereits vorhandenen Einträge "nach hinten". Drückt man aber erneut den Button "Text markieren", so erhält dieser Eintrag mit dem genannten "Update"-Befehl erneut das aktuellste Datum und steht somit wieder ganz "oben". Immer wenn also ein Texteintrag, der besonders wichtig ist, zu weit nach unten zu rutschen droht, genügt ein Klick auf den "Text markieren"-Button.
Mit einer "Präferenz-ID" könnte man dann ja jederzeit noch das Sortierergebnis "modifizieren".
Aliobaba
"MyMemoryDB" ( https://www.heise.de/download/product/mymemorydb-89626 )
Re: Todo Priorität in Datenbank günstig definieren
Eigentlich schon, aber umgedreht passt es besser zur Aufgabenstellung "Manche neu hinzukommende Aufgaben sind unverzüglich zu erledigen".TBug hat geschrieben: Denn wenn die Priorität gleich ist, dann sollte doch zuerst die Aufgabe erledigt werden, welche schon älter ist und nicht die. welche gerade eben neu dazugekommen ist.
Die beste Problemlösung wäre es wohl, die Aufgaben zu erledigen und nicht anzusammeln

-
- Beiträge: 179
- Registriert: Mi 2. Sep 2015, 11:09
- OS, Lazarus, FPC: Lazaurus 2.2.4 FPC 3.2.2
- CPU-Target: Windows 32/64bit
Re: Todo Priorität in Datenbank günstig definieren
Dann wären aber auch die anderen älteren Aufgaben unverzüglich zu erledigen gewesen, da sie ja die gleiche Priorität haben.Achtzig hat geschrieben:Eigentlich schon, aber umgedreht passt es besser zur Aufgabenstellung "Manche neu hinzukommende Aufgaben sind unverzüglich zu erledigen".

.
Re: Todo Priorität in Datenbank günstig definieren
Achtzig hat geschrieben:Die beste Problemlösung wäre es wohl, die Aufgaben zu erledigen und nicht anzusammeln



Nein, es ist tatsächlich so, dass neu hinzukommende Aufgaben gleicher Priorität als erstes erledigt werden müssen. Das liegt unter anderem daran, dass Aufgaben neue Teilaufgaben nach sich ziehen, die zuvor abgearbeitet werden müssen. Und falls dies nicht so ist, muss man diese per Hand verschieben.
Der Zeitstempel ist nun implementiert und es läuft.
Danke nochmal an Alle für die Inspiration!
Code: Alles auswählen
type
TLiveSelection = (lsMoney, lsChilds, lsTime);
TLive = Array[0..1] of TLiveSelection;