[gelöst] Todo Priorität in Datenbank günstig definieren

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.
Antworten
Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

[gelöst] Todo Priorität in Datenbank günstig definieren

Beitrag von Michl »

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?
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; 

baumina
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

Beitrag von baumina »

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.
.

Achtzig
Beiträge: 90
Registriert: Mo 15. Okt 2007, 13:09
OS, Lazarus, FPC: Debian
CPU-Target: xxBit

Re: Todo Priorität in Datenbank günstig definieren

Beitrag von Achtzig »

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
...

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: Todo Priorität in Datenbank günstig definieren

Beitrag von Michl »

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 :wink: ) 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).

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.

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).

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.
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.

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; 

TBug
Beiträge: 177
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

Beitrag von TBug »

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
...

Ich würde allerdings den ältesten Eintrag der gleichen Priorität oben anzeigen.

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.


.

Antrepolit
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

Beitrag von Antrepolit »

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?

So:

Code: Alles auswählen

SELECT * FROM Tabelle ORDER BY dringlichkeit, id
Grüße, Antrepolit

care only if your os is really burning

Aliobaba
Lazarusforum e. V.
Beiträge: 496
Registriert: Di 1. Mai 2012, 09:11

Re: Todo Priorität in Datenbank günstig definieren

Beitrag von Aliobaba »

Hallo,

ich habe es in dem Programm "MyMemoryDB" folgendermaßen gelöst:
( http://www.heise.de/download/mymemorydb-1189626.html )
Screenshot_X24.png


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))

eingetragen mit diesem Befehl:

Code: Alles auswählen

QText.SQL.Text:= ' UPDATE tText SET T3 = :dat  WHERE rID= :aID '


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
"MyMemoryDB" ( https://www.heise.de/download/product/mymemorydb-89626 )

Achtzig
Beiträge: 90
Registriert: Mo 15. Okt 2007, 13:09
OS, Lazarus, FPC: Debian
CPU-Target: xxBit

Re: Todo Priorität in Datenbank günstig definieren

Beitrag von Achtzig »

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.

Eigentlich schon, aber umgedreht passt es besser zur Aufgabenstellung "Manche neu hinzukommende Aufgaben sind unverzüglich zu erledigen".

Die beste Problemlösung wäre es wohl, die Aufgaben zu erledigen und nicht anzusammeln :mrgreen:

TBug
Beiträge: 177
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

Beitrag von TBug »

Achtzig hat geschrieben:Eigentlich schon, aber umgedreht passt es besser zur Aufgabenstellung "Manche neu hinzukommende Aufgaben sind unverzüglich zu erledigen".

Dann wären aber auch die anderen älteren Aufgaben unverzüglich zu erledigen gewesen, da sie ja die gleiche Priorität haben. :lol:


.

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: Todo Priorität in Datenbank günstig definieren

Beitrag von Michl »

Achtzig hat geschrieben:Die beste Problemlösung wäre es wohl, die Aufgaben zu erledigen und nicht anzusammeln :mrgreen:
:shock: Warum??? :shock: Nur so kommt nie Langeweile auf, oder?! :mrgreen:

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; 

Antworten