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?
sumber
Jawaban:
Anda bisa membuat tabel terpisah untuk diulang kembali. Tapi jujur saya akan menjorok ke meja yang sama dengan Type Field.
Sesuatu seperti ini:
sumber
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.
sumber
Dalam pandangan saya ada dua opsi:
sumber
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
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.
sumber
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:
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.
sumber
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:
sumber
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.
sumber
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?").
sumber