Wie sollen sich wiederholende Kalenderaufgaben in der Datenbank gespeichert werden?

14

Dies ist ein kleines persönliches Projekt für das Mikromanagement. Grundsätzlich speichere ich Aufgaben in einer SQLite3-Datenbank, die so aussieht:

    id INTEGER PRIMARY KEY AUTOINCREMENT
    label TEXT
    deadline INTEGER

So hat jede Aufgabe ein Fälligkeitsdatum (Deadline), das als Unix-Zeitstempel gespeichert wird. Soweit so gut, kann ich Einträge wie "tomorrow: visit grandma" machen und es wird eine neue Zeile mit "visit grandma" als Label erstellt und morgen als Unix-Frist umgewandelt.

Jetzt möchte ich eine neue Art von Aufgaben eingeben: Routinen - Aufgaben, die nach einem Zeitmuster wiederholt werden, wie "Alltag: saubere Küche". Wie können solche Aufgaben gespeichert oder modelliert werden?

Im Moment denke ich, dass im Fall einer Aufgabe, die jeden Tag erledigt werden muss, neue Zeilen in meiner Tabelle generiert werden, die die gleiche Bezeichnung haben und das Feld für die Frist um einen Tag erhöht wird. In diesem Fall muss ich in Zukunft ein Limit festlegen. Wenn ich zum Beispiel für jeden Tag eine Routine erstelle, wird eine neue Zeile für den Alltag des verbleibenden Jahres erstellt.

Gibt es einen einfacheren Weg, dies zu tun? Fehlen mir einige offensichtliche Prinzipien für den Datenbankentwurf?

François ッ Vespa ت
quelle
3
Ja. Verwenden Sie ein geeignetes Scheduler-Tool, anstatt einen weiteren Job Scheduler zu erfinden. Nachdem der SOPA-Protest beendet ist, lesen Sie en.wikipedia.org/wiki/Open_Source_Job_Scheduler . Dies wurde bereits viele Male gut gelöst.
S.Lott
danke Lott! ja ich ahnte, dass es dafür eine elegante lösung gab! Ich warte auf das SOPA-Ende oder überprüfe, ob es eine Übersetzung in den anderen Wikipedia-Ländern gibt Weg für ein kleines Greasemonkey-Skript :)
François ッ Vespa ت
1
Allgemeiner Hinweis: Die meisten der folgenden Beiträge berücksichtigen nicht die Frage, wie die Daten tatsächlich gespeichert werden. Ich meine, bei einer Aufgabe, die 2 Jahre lang jeden Montag wiederholt wird, wie viele Zeilen müssen auf die Festplatte geschrieben werden?
NoChance
Oder sehen Sie diese Antwort .
Kris Harper
@ root45 schön, ich benutze tatsächlich Luchs von der Kommandozeile, noch einfacher :)
François ッ Vespa ت

Antworten:

7

Sie könnten eine separate Tabelle für wiederkehrende erstellen. Aber ehrlich gesagt würde ich es mit einem Typfeld in dieselbe Tabelle schreiben.

Etwas wie das:

ID - Int Pk

TaskDescription - TEXT

Type - Text - (Re-Occurring, or Single Occurrence) 

Due- TimeStamp - for Single Occurrence is the Date time

LastTimeCompleted - Time Stamp

ReoccurringUnit - Text - "Days", Weeks, Month, Ext

ReoccurringEveryX - Int - Reoccurring interval 
Idioten
quelle
interessant, ich bin eine mögliche Lösung ähnlich wie diese tatsächlich zu erforschen, ich meine SQL - Funktionen noch arbeite, werde ich schreiben , wenn erfolgreich
FrançoisッVespa ت
Interessanterweise versuche ich, eine Abfrage zu erstellen, mit der sowohl wiederkehrende als auch nicht wiederkehrende Aufgaben abgerufen und nach ihrem Fälligkeitsdatum sortiert werden können. Irgendeine Ahnung?
Harshal Patil
2

Zusätzlich zu dem Kommentar von S.Lott kann Ihnen Martin Fowler - Wiederkehrende Termine für Kalender PDF helfen (ich fand es etwas schwierig).

Beachten Sie auch, dass verschiedene UI-Tools die von Ihnen beschriebene Funktion standardmäßig anbieten (mit einfachem Task-Modell). Ich würde dieses Problem als ein schwer zu lösendes Datenbankentwurfsproblem ohne solche Werkzeuge betrachten.

Keine Chance
quelle
1

Meiner Ansicht nach gibt es zwei Möglichkeiten:

  • Speichern Sie eine große Menge gleicher Zeilen für wiederkehrende Elemente. Sie müssen jedoch enden (entweder bis zu einem Enddatum oder einer begrenzten Anzahl von Elementen) und als wiederkehrendes Element gekennzeichnet sein. Wenn Sie das Ereignis ändern, müssen Sie alle aktualisieren. Wenn Sie jedoch einmal davon abweichen möchten, können Sie einfach die Verbindung zwischen einem Ereignis trennen und es zu einem normalen Ereignis machen.
  • Speichern Sie das Ereignis als wiederkehrendes Element mit einem bestimmten Wiederholungsschema und berechnen Sie für ein bestimmtes Datum, welche wiederkehrenden Elemente zum angegebenen Datum fällig sind. Dies gibt die Möglichkeit einer unendlichen Wiederholung.
Geerten
quelle
so sehe ich es auch
François ッ Vespa ت
1

Wenn dies ein persönliches Projekt ist und Sie nur eine Möglichkeit zum Speichern Ihrer Aufgaben wünschen , empfehle ich TaskCoach . Es ist eine Desktop-Anwendung, plattformübergreifend, Open Source, einfach zu starten und verfügt über wirklich gute Funktionen.

Wenn Sie eine Aufgabenanwendung entwickeln, ist es am wahrscheinlichsten, für jede wiederkehrende Aufgabe eine neue Zeile hinzuzufügen. Die Logik ist, dass jede Aufgabe eine separate Entität für sich ist und abgeschlossen werden muss, bevor dieselbe Aufgabe am nächsten Tag gestartet werden kann. Wenn Sie es nur inkrementieren, können Sie den Verlauf der Aufgabe einfach nicht erfassen.

Wenn Sie der Meinung sind, dass es Ihnen nur eine große Liste geben würde, wenn einige Aufgaben nicht erledigt wären, könnten Sie ein Ereignis auslösen, sobald die wiederkehrende Aufgabe erledigt ist, sodass die neue Aufgabe nur dann als neue Zeile generiert wird, wenn die Aufgabe erledigt ist als erledigt markiert. Wie von Morons vorgeschlagen, können Sie eine separate Tabelle mit einem Flag für wiederkehrende Aufgaben in der Originaltabelle zusammen mit Daten für die Wiederholung (Tage, Wochen, Wiederholungszeit) verwenden, sodass Sie nur ein einfaches Skript haben, mit dem die wiederkehrenden Aufgaben basierend auf generiert werden können Datum oder eine Bedingung oder durch Etikett.

Wenn Sie sich jedoch sicher sind, dass die Aufgabe sich ohne Änderungen wiederholt (z. B. tägliches Putzen) und kein umfangreiches Tracking erfordert, können Sie einfach die folgende Struktur ausprobieren

  • Wiederholungsflag - Zeigt an, dass die Aufgabe wiederholt ausgeführt wird
  • Wiederholungszeitraum - Tag, Woche, Monat
  • Anzahl der erstellten Aufgaben - Dies würde die Aufgabe basierend auf der Wiederholungsperiode inkrementieren. Wenn die Aufgabe also heute beginnt und einen wiederkehrenden Zeitraum von einem Tag hat, wird sie morgen nur um eins erhöht
  • Anzahl erledigter Aufgaben - Dies würde sich erhöhen, wenn die Aufgabe erledigt wird

Die Logik ist der Unterschied zwischen erledigten Aufgaben und erstellten Aufgaben sollte immer die Wiederholungsperiode sein, wenn die Aufgabe immer erledigt ist. Wenn Sie also die Differenz der Tage durch den wiederkehrenden Zeitraum dividieren, erhalten Sie einen Hinweis darauf, wie lange die Aufgabe noch aussteht.

Vielen Dank für den Hinweis von Kareem

Meiner Meinung nach ist es schwierig, Aufgabenanwendungen für alle zu erstellen.

Übermensch
quelle
danke für die konstruktive antwort! Dies ist ein Projekt zum Spaß und ich möchte es so flexibel wie möglich gestalten, mit Fragen wie 'alle 4 Tage wiederholt werden, außer wenn es Mittwoch ist'
François ッ Vespa ت
1

Die bei weitem häufigste Operation wird darin bestehen, alle Ereignisse aufzulisten, die in einem bestimmten Zeitraum auftreten. Optimieren Sie also Ihre Daten, damit die Frage durch eine einfache SQL-Abfrage beantwortet werden kann. Ich würde zwei Tabellen erstellen:

CREATE TABLE events(start TIMESTAMP, end TIMESTAMP, name TEXT, user_id LONG,
                    recurrence_id LONG, ...);
CREATE TABLE recurrences(id LONG, start TIMESTAMP, end TIMESTAMP, name TEXT, 
                         frequency ...);

Indizieren Sie die Ereignistabelle nach Start- und Endzeiten. Dann können alle Anfragen aus der Ereignistabelle sehr schnell beantwortet werden. Wenn eine Wiederholung bearbeitet wird, löschen Sie einfach alle entsprechenden Ereignisse und erstellen Sie sie erneut.

Dieser Rat wird schamlos aus einem Buch von Tom Kite wiederholt.

Kevin Cline
quelle
1

Wiederholte Aufgaben sollten ein Start- und ein Enddatum haben. Für eine einzelne Datumsaufgabe wäre dies dasselbe Datum.

Erstellen Sie eine Art "Dates" -Tabelle, die einen Datensatz für jeden Tag enthält, den Sie von Anfang an als relevant erachten, und zwar so weit in die Zukunft, wie Sie möchten: 31.12.2100, und konvertieren Sie ihn in Ihr Format.

Eine Abfrage könnte folgendermaßen aussehen:

Select 
  t.id
  , t.label
  , d.UnixDate
from Tasks as t
inner join Dates as d
on d.UnixDate >= t.StartDate
  and d.UnixDate <= t.EndDate
where t.id = [ID Param]
JeffO
quelle
0

Ich habe vor ähnlichen Jahren eine Oberfläche wie Windows Task Scheduler implementiert und im Grunde genommen für jede Aufgabe StartDate, EndDate (kann null sein), StartTime und RecurringDays, die Wochentage enthalten, an denen die Aufgabe geplant werden muss.

Mauro Destro
quelle
Das ist interessant. Gab es einige Designgrenzen, dh Abfragen, die nicht durchgeführt werden konnten (z. B. "jeden Wochentag wiederholen")?
François ッ Vespa ت
0

Sie können zwei Tabellen verwenden: eine für die Beschreibung der Aufgaben, die andere für deren Status (erledigt / nicht erledigt und andere Informationen: Zeitaufwand, Beendigungsstatus, Speicherort der Protokolldatei usw.) Name der Aufgabe und Datum oder Häufigkeit der Ausführung: Es würde nur eine Zeile pro Aufgabe geben. Jeden Tag füllte ein Prozess die Statustabelle für die heute auszuführenden Aufgaben aus der Beschreibungstabelle (Sie konnten eine Woche oder einen Monat im Voraus angeben).

Durch die programmgesteuerte Generierung der Statustabelle erhalten Sie die gewünschte Flexibilität für die Häufigkeit (z. B. "jeden Wochentag außer an Feiertagen für Land X" - sie kann sogar als Zeichenfolge gespeichert werden). In einer Statustabelle können Sie überprüfen, ob oder wie oft die Aufgaben fehlschlagen (zum Beispiel: "Ich sollte jeden Tag ausgeführt werden: Wie oft hatte ich Zeit dafür?").

Vincent Zoonekynd
quelle