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?
quelle
Antworten:
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:
quelle
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.
quelle
Meiner Ansicht nach gibt es zwei Möglichkeiten:
quelle
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
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.
quelle
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:
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.
quelle
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:
quelle
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.
quelle
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?").
quelle