Come devono essere memorizzate le attività di calendario ripetitive nel database?

14

Questo è per un piccolo progetto personale per la micro-gestione. Fondamentalmente, memorizzo le attività in un database SQLite3 simile a questo:

    id INTEGER PRIMARY KEY AUTOINCREMENT
    label TEXT
    deadline INTEGER

Quindi ogni attività ha una data di scadenza (scadenza) che è memorizzata come timbro temporale Unix. Fin qui tutto bene, posso inserire voci come "domani: visita la nonna" e una nuova riga viene creata con "visita nonna" come etichetta e domani trasformata come ora Unix per la scadenza.

Ora vorrei inserire un nuovo tipo di attività: routine - attività ripetute su un modello temporale, come "tutti i giorni: cucina pulita". In che modo queste attività possono essere archiviate o modellate?

Per il momento, penso che, nel caso di un'attività che deve essere eseguita ogni giorno, generare nuove righe nella mia tabella che abbiano la stessa etichetta e il campo di scadenza incrementato di un giorno. In questo caso, ho bisogno di fissare un limite in futuro. Ad esempio, se creo una routine per ogni giorno, crea una nuova riga per tutti i giorni dell'anno restante.

C'è un modo più semplice per farlo? Mi mancano alcuni principi di progettazione di database ovvi?

    
posta François ッ Vespa ت 18.01.2012 - 11:58
fonte

8 risposte

6

Potresti creare una tabella separata per ripetersi. Ma sinceramente mi piacerebbe metterlo nella stessa tabella con un campo tipo.

Qualcosa del genere:

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 
    
risposta data 18.01.2012 - 14:42
fonte
2

Oltre al commento di S.Lott, Martin Fowler - Eventi ricorrenti per i calendari PDF può aiutarti (I trovato un po 'difficile).

Si noti inoltre che diversi strumenti dell'interfaccia utente offrono la funzione che si sta descrivendo out of the box (con un semplice modello di attività). Considererei questo problema un problema di progettazione del database difficile da risolvere senza tali strumenti.

    
risposta data 18.01.2012 - 13:02
fonte
1

A mio avviso ci sono due opzioni:

  • Memorizza una grande quantità di righe uguali per gli articoli ricorrenti, tuttavia devono terminare (tramite una data di fine o un numero finito di elementi) e devono essere contrassegnati come un elemento ricorrente. Quando cambi l'evento, devi aggiornarli tutti, ma quando vuoi deviare una volta, puoi semplicemente "interrompere" la connessione tra un evento e renderlo un evento normale.
  • Memorizza l'evento come un elemento ricorrente, con un determinato schema di ripetizione e calcola per una determinata data che gli elementi ricorrenti sono dovuti alla data specificata. Questo dà la possibilità di una ripetizione infinita.
risposta data 18.01.2012 - 16:14
fonte
1

Se si tratta di un progetto personale e desideri solo un modo per archiviare le tue attività, ti consiglio TaskCoach . Si tratta di un'applicazione desktop, multi-piattaforma, open source, facile da avviare e dotata di ottime funzionalità.

Nel caso si stia sviluppando un'applicazione per attività, il modo più probabile è aggiungere una nuova riga per ogni attività ricorrente. La logica è che ogni attività è un'entità separata in sé e deve essere completata prima che lo stesso compito venga avviato il giorno successivo. Se lo si incrementa, non è possibile acquisire la cronologia dell'attività.

Nel caso in cui ritieni che ti darebbe una lista importante se alcune attività non fossero state completate, potresti attivare un evento una volta completata l'attività ricorrente in modo che la nuova attività venga generata come una nuova riga solo quando l'attività è contrassegnata come completata. Come suggerito da Morons, è possibile utilizzare una tabella separata con un flag per le attività ricorrenti nella tabella originale insieme ai dati per la ricorrenza (giorni, settimane, ore ricorrenti) in modo da poter disporre semplicemente di uno script che generi le attività ricorrenti in base a data o una condizione o per etichetta.

Ma se sei sicuro che il compito è sicuramente ripetitivo senza alcuna modifica (come il pennello quotidiano) e non ha bisogno di un monitoraggio completo, allora potresti semplicemente provare la seguente struttura

  • Flag di ricorrenza - per indicare che l'attività è ricorrente
  • Periodo di ricorrenza - giorno, settimana, mese
  • Numero di attività create - Ciò incrementerebbe l'attività in base al periodo di ricorrenza. Quindi se l'attività inizia oggi e ha un periodo di ricorrenza di un giorno, aumenterebbe di un'unità di un domani
  • Numero di attività completate - Questo incrementerebbe se l'attività viene completata

La logica è la differenza tra le attività completate e le attività create dovrebbero sempre essere il periodo di ricorrenza se l'attività è sempre completata. Quindi, dividendo la differenza dei giorni per periodo di ricorrenza, ti darebbe un'indicazione di quanto a lungo il compito è stato sospeso.

Grazie per Kareem per averlo indicato

IMHO, le applicazioni di attività sono difficili da costruire per le persone in generale.

    
risposta data 18.01.2012 - 15:49
fonte
1

Di gran lunga l'operazione più frequente sarà quella di elencare tutti gli eventi che si verificano in un periodo di tempo. Quindi ottimizza i tuoi dati in modo che la domanda possa essere risolta da una semplice query SQL. Vorrei creare due tabelle:

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

Indicizza la tabella degli eventi per ora di inizio e di fine. Quindi tutte le domande possono essere risolte molto velocemente dalla tabella degli eventi. Quando viene modificata una ricorrenza, è sufficiente eliminare e ricreare tutti gli eventi corrispondenti.

Questo consiglio è ripetuto spudoratamente da un libro di Tom Kite.

    
risposta data 18.01.2012 - 22:58
fonte
1

Le attività ripetute dovrebbero avere una data di inizio e una data di fine. Per un'attività a singola data, la stessa data sarà la stessa.

Crea una sorta di tabella "Date" che ha un record per ogni giorno che ritieni sia rilevante dall'inizio delle tue esigenze nel futuro che vuoi: 12/31/2100 per esempio e converti nel tuo formato.

Una query potrebbe essere simile a:

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]
    
risposta data 18.01.2012 - 15:12
fonte
0

Ho fatto qualcosa di simile anni fa implementando un'interfaccia come Windows Task Scheduler e fondamentalmente per ogni attività che hai StartDate, EndDate (può essere null), StartTime e RecurringDays che contiene giorni della settimana in cui l'attività deve essere pianificata.

    
risposta data 18.01.2012 - 15:28
fonte
0

È possibile utilizzare due tabelle: una per la descrizione delle attività, l'altra per il loro stato (completato / non completato e altre informazioni: tempo trascorso, stato di uscita, posizione del file di registro, ecc.) La tabella descrittiva conterrà il nome dell'attività e la data o la frequenza di esecuzione: ci sarà solo una riga per attività. Ogni giorno, un processo popolerebbe la tabella di stato per le attività da eseguire oggi, dalla tabella di descrizione (è possibile popolare una settimana o un mese in anticipo).

Generare la tabella di stato a livello di programmazione ti offre tutta la flessibilità che desideri per la frequenza (ad es., "ogni giorno della settimana tranne i giorni festivi per il paese X" - potrebbe persino essere memorizzata come stringa). Avere una tabella di stato ti permette di controllare se o quanto spesso le attività falliscono (ad esempio: "Dovevo correre ogni giorno: quanto spesso ho avuto il tempo di farlo?").

    
risposta data 21.01.2012 - 02:06
fonte

Leggi altre domande sui tag