Bagaimana seharusnya tugas kalender berulang disimpan dalam database?

14

Ini untuk proyek pribadi kecil untuk manajemen mikro. Pada dasarnya, saya menyimpan tugas dalam database SQLite3 yang terlihat seperti ini:

    id INTEGER PRIMARY KEY AUTOINCREMENT
    label TEXT
    deadline INTEGER

Jadi setiap tugas memiliki tenggat waktu (tenggat waktu) yang disimpan sebagai Cap Waktu Unix. Sejauh ini bagus, saya bisa membuat entri seperti "besok: kunjungi nenek" dan baris baru akan dibuat dengan "kunjungi nenek" sebagai label dan besok berubah sebagai waktu Unix untuk tenggat waktu.

Sekarang saya ingin memasukkan jenis tugas baru: rutin - tugas yang diulang pada pola waktu, seperti "sehari-hari: dapur bersih". Bagaimana cara tugas-tugas tersebut disimpan atau dimodelkan?

Untuk saat ini, saya berpikir bahwa, dalam kasus tugas yang perlu dilakukan setiap hari, untuk menghasilkan baris baru di meja saya yang akan memiliki label yang sama, dan bidang tenggat waktu bertambah satu hari. Dalam hal ini, saya harus memperbaiki batas di masa depan. Misalnya, jika saya membuat rutin untuk setiap hari, itu membuat baris baru untuk setiap hari dari tahun yang tersisa.

Apakah ada cara yang lebih sederhana untuk melakukan ini? Apakah saya kehilangan beberapa prinsip desain database yang jelas?

François ッ Vespa ت
sumber
3
Iya. Gunakan alat penjadwal yang tepat alih-alih menemukan penjadwal pekerjaan lain. Setelah protes SOPA berakhir, baca en.wikipedia.org/wiki/Open_Source_Job_Scheduler . Ini telah dipecahkan, baik, sudah banyak kali.
S.Lott
terima kasih Lott! ya saya curiga ada solusi yang elegan untuk ini! Saya akan menunggu akhir SOPA atau memeriksa apakah ada terjemahan di negara-negara Wikipedia lainnya. Sunting: sebenarnya saya hanya memperhatikan bahwa sumber HTML masih tersedia di Wikipedia AS, layar hitam seperti trik CSS, saya ada di saya cara untuk skrip greasemonkey kecil :)
François ッ Vespa ت
1
Catatan Umum: Sebagian besar posting di bawah ini tidak memperhitungkan pertanyaan bagaimana data sebenarnya disimpan. Maksud saya diberi tugas yang berulang setiap Senin selama 2 tahun, berapa baris yang perlu ditulis ke disk?
NoChance
Atau lihat jawaban ini .
Kris Harper
@ root45 bagus, saya benar-benar menggunakan lynx dari command line, lebih mudah :)
François ッ Vespa ت

Jawaban:

7

Anda bisa membuat tabel terpisah untuk diulang kembali. Tapi jujur ​​saya akan menjorok ke meja yang sama dengan Type Field.

Sesuatu seperti ini:

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 
Orang bodoh
sumber
menarik, saya sebenarnya sedang mencari solusi yang mungkin mirip dengan yang ini, saya masih menjalankan fungsi SQL saya, saya akan memposting jika berhasil
François ッ Vespa ت
Menarik, saya mencoba untuk membuat kueri yang dapat mengambil tugas berulang dan non-berulang dan kemudian mengurutkannya berdasarkan tanggal jatuh tempo mereka. Ada petunjuk?
Harshal Patil
2

Selain komentar dari S.Lott, Martin Fowler - Acara Berulang untuk Kalender PDF dapat membantu Anda (saya merasa agak sulit).

Perhatikan juga bahwa beberapa alat UI menawarkan fungsi yang Anda gambarkan di luar kotak (dengan model tugas sederhana). Saya akan menganggap masalah ini sebagai sulit untuk memecahkan masalah desain database tanpa alat tersebut.

Tidak mungkin
sumber
1

Dalam pandangan saya ada dua opsi:

  • Menyimpan sejumlah besar baris yang sama untuk item yang berulang, namun harus berakhir (baik melalui tanggal akhir, atau jumlah item yang terbatas), dan harus ditandai sebagai item yang berulang. Ketika Anda mengubah acara, Anda harus memperbarui semuanya, tetapi ketika Anda ingin menyimpang satu kali, Anda bisa 'memutus' koneksi antara satu peristiwa, dan menjadikannya peristiwa biasa.
  • Simpan acara sebagai item berulang, dengan skema pengulangan tertentu, dan hitung untuk tanggal tertentu yang item berulangnya jatuh tempo pada tanggal yang diberikan. Ini memberikan kemungkinan untuk pengulangan yang tak terbatas.
Geerten
sumber
begitulah saya melihatnya juga
François ッ Vespa ت
1

Jika ini adalah proyek pribadi dan Anda hanya ingin cara untuk menyimpan tugas Anda, saya sarankan TaskCoach . Ini adalah aplikasi desktop, multi-platform, open source, mudah untuk memulai dan memiliki fitur yang sangat bagus.

Jika Anda sedang mengembangkan aplikasi tugas, maka cara yang paling mungkin adalah menambahkan baris baru untuk setiap tugas yang berulang. Logikanya adalah bahwa setiap tugas adalah entitas yang terpisah dalam dirinya sendiri dan harus diselesaikan sebelum tugas yang sama akan dimulai pada hari berikutnya. Jika Anda hanya menambahnya, Anda tidak bisa menangkap riwayat tugas.

Jika Anda merasa, bahwa itu hanya akan memberi Anda daftar besar jika beberapa tugas tidak selesai maka Anda dapat memicu suatu peristiwa setelah tugas berulang selesai sehingga tugas baru akan dihasilkan sebagai baris baru hanya ketika tugas tersebut selesai. ditandai sebagai selesai. Seperti yang disarankan oleh Morons, Anda dapat menggunakan tabel terpisah dengan bendera untuk tugas berulang di tabel asli bersama dengan data untuk pengulangan (hari, minggu, waktu berulang) sehingga Anda bisa memiliki skrip sederhana yang dapat menghasilkan tugas berulang berdasarkan tanggal atau ketentuan atau dengan label.

Tetapi jika Anda yakin bahwa tugas itu pasti berulang tanpa perubahan (seperti menyikat setiap hari) dan tidak perlu pelacakan luas, maka Anda bisa mencoba struktur berikut

  • Bendera pengulangan - untuk menunjukkan bahwa tugas tersebut berulang
  • Periode berulang - hari, minggu, bulan
  • Jumlah tugas yang dibuat - Ini akan menambah tugas berdasarkan periode berulang. Jadi jika tugas dimulai hari ini dan memiliki periode berulang satu hari, itu hanya akan bertambah satu besok
  • Jumlah tugas yang diselesaikan - Ini akan bertambah jika tugas diselesaikan

Logikanya adalah perbedaan antara tugas yang diselesaikan dan tugas yang dibuat harus selalu menjadi periode berulang jika tugas tersebut selalu selesai. Jadi, membagi perbedaan hari dengan periode berulang akan memberi Anda indikasi berapa lama tugas telah tertunda.

Terima kasih untuk Kareem karena menunjukkan ini

IMHO, aplikasi tugas sulit dibangun untuk orang-orang pada umumnya.

Ubermensch
sumber
terima kasih atas jawaban konstruktif! ini adalah proyek untuk bersenang-senang dan saya ingin membuatnya sefleksibel mungkin, dengan pertanyaan seperti 'diulang setiap 4 hari kecuali jika itu adalah hari Rabu'
François ッ Vespa ت
1

Sejauh ini, operasi yang paling sering adalah membuat daftar semua peristiwa yang terjadi dalam periode waktu. Jadi optimalkan data Anda sehingga pertanyaan itu dapat dijawab dengan kueri SQL sederhana. Saya akan membuat dua tabel:

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

Indeks tabel acara dengan waktu mulai dan berakhir. Maka semua pertanyaan dapat dijawab dari tabel acara dengan sangat cepat. Ketika perulangan diedit, cukup hapus dan buat kembali semua acara yang sesuai.

Nasihat ini tanpa malu-malu diulang dari sebuah buku karya Tom Kite.

kevin cline
sumber
1

Tugas yang diulang harus memiliki tanggal mulai dan tanggal akhir. Untuk tugas kencan tunggal, mereka akan menjadi tanggal yang sama.

Buat semacam "Tanggal" tabel yang memiliki satu catatan untuk setiap hari yang Anda anggap relevan dari awal kebutuhan Anda sejauh yang Anda inginkan: 12/31/2100 misalnya dan konversi ke format Anda.

Kueri mungkin terlihat seperti:

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
sumber
0

Saya telah melakukan sesuatu yang serupa bertahun-tahun lalu dengan mengimplementasikan antarmuka seperti Windows Task Scheduler dan pada dasarnya untuk setiap tugas yang Anda miliki adalah StartDate, EndDate (bisa nol), StartTime dan RecurringDays yang berisi hari dalam seminggu ketika tugas harus dijadwalkan.

Mauro Destro
sumber
Itu menarik. apakah ada beberapa batasan desain, yaitu pertanyaan yang tidak dapat dilakukan (seperti 'diulang setiap hari minggu')?
François ッ Vespa ت
0

Anda dapat menggunakan dua tabel: satu untuk deskripsi tugas, yang lain untuk statusnya (selesai / tidak dilakukan, dan informasi lainnya: waktu yang dihabiskan, status keluar, lokasi file log, dll.) Tabel deskripsi akan berisi nama tugas, dan tanggal atau frekuensi pelaksanaannya: hanya akan ada satu baris per tugas. Setiap hari, suatu proses akan mengisi tabel status untuk tugas yang harus dilakukan hari ini, dari tabel deskripsi (Anda dapat mengisi satu minggu atau satu bulan sebelumnya).

Membuat tabel status secara terprogram memberi Anda semua fleksibilitas yang Anda inginkan untuk frekuensi (misalnya, "setiap hari kerja kecuali hari libur bank untuk negara X" - bahkan dapat disimpan sebagai string). Memiliki tabel status memungkinkan Anda untuk memeriksa apakah atau seberapa sering tugas gagal (misalnya: "Saya seharusnya menjalankan setiap hari: seberapa sering saya punya waktu untuk melakukannya?").

Vincent Zoonekynd
sumber