Tekrarlanan takvim görevleri veritabanında nasıl saklanmalıdır?


14

Bu, mikro yönetim için küçük bir kişisel proje içindir. Temel olarak, görevleri gibi görünen bir SQLite3 veritabanında depolamak:

    id INTEGER PRIMARY KEY AUTOINCREMENT
    label TEXT
    deadline INTEGER

Bu nedenle, her görevin bir Unix Zaman Damgası olarak depolanan bir bitiş tarihi (son tarih) vardır. Şimdiye kadar çok iyi, "yarın: büyükanne ziyaret" gibi girişler yapabilirim ve etiket olarak "ziyaret büyükanne" ile yeni bir satır oluşturulur ve yarın son tarih için Unix zamanı dönüştü.

Şimdi yeni tür görevler girmek istiyorum: rutinler - "günlük: temiz mutfak" gibi bir zaman deseninde tekrarlanan görevler. Bu tür görevler nasıl saklanabilir veya modellenebilir?

Şimdilik, her gün yapılması gereken bir görev durumunda, masamda aynı etikete sahip olacak yeni satırlar oluşturmayı ve son teslim alanının bir gün artırıldığını düşünüyorum. Bu durumda, gelecekte bir sınır belirlemem gerekiyor. Örneğin, her gün için bir rutin oluşturursam, kalan yılın her günü için yeni bir satır oluşturur.

Bunu yapmanın daha basit bir yolu var mı? Bazı belirgin veritabanı tasarım ilkelerini kaçırıyor muyum?


3
Evet. Başka bir iş zamanlayıcıyı icat etmek yerine uygun bir zamanlayıcı aracı kullanın. SOPA protestosu sona erdikten sonra, en.wikipedia.org/wiki/Open_Source_Job_Scheduler sayfasını okuyun . Bu, zaten birçok kez çözüldü.
S.Lott

teşekkürler Lott! evet bunun için zarif bir çözüm olduğundan şüphelendim! SOPA sonunu bekleyeceğim veya diğer Wikipedia ülkelerinde bir çeviri olup olmadığını kontrol edeceğim Edit: aslında ive sadece HTML kaynağının Wikipedia ABD'de hala mevcut olduğunu fark ettim, karartma ekranı bir CSS hilesi gibi, ben benim bir greasemonkey senaryosu için bir yol :)
François ッ Vespa ت

1
Genel Not: Aşağıdaki gönderilerin çoğu, verilerin gerçekte nasıl saklandığı sorusunu dikkate almaz. Yani her Pazartesi 2 yıl boyunca tekrar eden bir görev verildiğinde, diske kaç satır yazılması gerekecek?
NoChance

Veya bu cevaba bakınız .
Kris Harper

@ root45 nice, aslında komut satırından lynx kullanıyorum, daha da kolay :)
François ッ Vespa ت

Yanıtlar:


7

Yeniden düzenlemek için ayrı bir tablo yapabilirsiniz. Ama dürüst olmak gerekirse ben bir Type Field ile aynı masaya koymak juts olur.

Bunun gibi bir şey:

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 

ilginç, aslında buna benzer olası bir çözümü araştırıyorum, hala SQL işlevlerimi çalışıyorum, başarılı olursam göndereceğim
François ッ Vespa ت 18:12 '

İlginç, ben yinelenen ve yinelenen olmayan görevleri hem getirip daha sonra son tarihlerine göre sıralayabilirsiniz sorgu ile gelmeye çalışıyorum. Bir ipucu?
Harshal Patil

2

S.Lott'un yorumuna ek olarak, Martin Fowler - Takvimler için Yinelenen Etkinlikler PDF size yardımcı olabilir (Biraz zor buldum).

Ayrıca, birkaç UI aracının kutudan çıkardığınız işlevi sunduğunu unutmayın (basit görev modeliyle). Bu sorunu böyle bir araç olmadan veritabanı tasarım sorunu çözmek zor olarak kabul ediyorum.


1

Bana göre iki seçenek var:

  • Tekrarlayan öğeler için büyük miktarda eşit satır depolayın, ancak bunların bitmesi gerekir (bitiş tarihi veya sonlu sayıda öğe ile) ve tekrarlayan öğe olarak işaretlenmeleri gerekir. Etkinliği değiştirdiğinizde, hepsini güncellemeniz gerekir, ancak bir kez sapmak istediğinizde, bir etkinlik arasındaki bağlantıyı 'kesebilir' ve normal bir etkinlik yapabilirsiniz.
  • Etkinliği, belirli bir tekrarlama şemasına sahip, tekrarlayan bir öğe olarak depolayın ve belirli bir tarih için, tekrarlanan öğelerin belirli bir tarihte ödenmesini hesaplayın. Bu sonsuz tekrarlama imkanı verir.

Ben de böyle görüyorum
François ッ Vespa ت

1

Bu kişisel bir projeyse ve görevlerinizi saklamanın bir yolunu istiyorsanız, TaskCoach'ı tavsiye ederim . Bir masaüstü uygulaması, çoklu platform, açık kaynak, başlamak kolay ve gerçekten iyi özelliklere sahip.

Bir görev uygulaması geliştiriyorsanız, en olası yol, yinelenen her görev için yeni bir satır eklemektir. Mantık, her görevin kendi içinde ayrı bir varlık olması ve aynı görevin ertesi gün başlatılmadan önce tamamlanması gerektiğidir. Sadece arttırırsanız, görevin geçmişini yakalayamazsınız.

Birkaç görev tamamlanmadığında size büyük bir liste vereceğini düşünüyorsanız, yinelenen görev tamamlandıktan sonra bir etkinliği tetikleyebilirsiniz, böylece yeni görev yalnızca görev olduğunda yeni bir satır olarak oluşturulur. tamamlandı olarak işaretlendi. Morons tarafından önerildiği gibi, orijinal tabloda yinelenen görevler için bayrakla birlikte ayrı bir tablo, yineleme (günler, haftalar, yineleme süresi) verileriyle birlikte kullanabilirsiniz, böylece yinelenen görevleri temel alan basit bir komut dosyasına sahip olabilirsiniz. tarih veya koşul veya etikete göre.

Ancak, görevin herhangi bir değişiklik yapmadan (tekrar tekrar fırça gibi) kesinlikle tekrarlanan bir görev olduğundan eminseniz ve kapsamlı bir izlemeye ihtiyaç duymazsanız, aşağıdaki yapıyı deneyebilirsiniz

  • Yineleme bayrağı - görevin yinelendiğini belirtmek için
  • Tekrarlama dönemi - gün, hafta, ay
  • Oluşturulan görev sayısı - Bu, görevi yineleme süresine göre artırır. Dolayısıyla, görev bugün başlıyor ve bir günlük bir tekrarlama süresine sahipse, yarın bir kez artacaktır.
  • Tamamlanan görev sayısı - Görev tamamlanırsa bu artar

Mantık, tamamlanan görevler arasındaki farktır ve görev her zaman tamamlanırsa, oluşturulan görevler her zaman yineleme dönemi olmalıdır. Dolayısıyla, günlerin farkını tekrarlama dönemine bölmek, görevin ne kadar süredir beklediğini gösterir.

Kareem'e bunu işaret ettiği için teşekkürler

IMHO, görev uygulamalarının genel olarak insanlar için oluşturulması zordur.


yapıcı cevap için teşekkürler! Bu bir eğlence projesi ve bunu 'çarşamba hariç her 4 günde bir tekrarlanacak' gibi sorgularla olabildiğince esnek hale getirmek istiyorum
François ッ Vespa ت

1

Şimdiye kadar en sık yapılan işlem, bir zaman diliminde meydana gelen tüm olayları listelemek olacaktır. Bu nedenle, verilerinizi basit bir SQL sorgusu tarafından yanıtlanabilmesi için verilerinizi optimize edin. İki tablo oluştururdum:

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

Olay tablosunu başlangıç ​​ve bitiş zamanlarına göre dizine alın. Sonra tüm sorgular olaylar tablosundan çok hızlı bir şekilde cevaplanabilir. Bir yineleme düzenlendiğinde, karşılık gelen tüm etkinlikleri silin ve yeniden oluşturun.

Bu tavsiye, Tom Kite'nin bir kitabından utanmadan tekrarlanır.


1

Tekrarlanan görevlerin bir başlangıç ​​tarihi ve bir bitiş tarihi olmalıdır. Tek bir randevu için aynı tarih olacaktır.

İhtiyaçlarınızın başlangıcından geleceğe kadar istediğiniz kadar alakalı olduğunu düşündüğünüz her gün için bir kaydı olan bir tür "Tarihler" tablosu oluşturun: örneğin 12/31/2100 ve formatınıza dönüştürün.

Bir sorgu şöyle görünebilir:

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]

0

Yıllar önce benzer bir şey yaptım, Windows Görev Zamanlayıcısı gibi bir arabirimi uygulayarak ve temelde, görev zamanlanması gereken haftanın günlerini içeren StartDate, EndDate (null olabilir), StartTime ve RecurringDays'e sahip olduğunuz her görev için.


İlginç. bazı tasarım sınırları var mıydı, yani gerçekleştirilemeyen sorgular ('her hafta tekrarlanacak' gibi)?
François ッ Vespa ت

0

İki tablo kullanabilirsiniz: biri görevlerin açıklaması için, diğeri durumları için (bitti / yapılmadı ve diğer bilgiler: harcanan zaman, çıkış durumu, günlük dosyasının konumu, vb.) Açıklama tablosu görevin adı ve çalıştırılması gereken tarih veya sıklık: görev başına yalnızca bir satır olacaktır. Her gün bir işlem, bugün yapılacak görevlerin durum tablosunu açıklama tablosundan doldurur (bir hafta veya bir ay önceden doldurabilirsiniz).

Durum tablosunu programlı olarak oluşturmak, frekans için istediğiniz tüm esnekliği sağlar (örneğin, "X ülkesi için resmi tatil günleri hariç her hafta içi" - hatta dize olarak saklanabilir). Bir durum tablosuna sahip olmak, görevlerin başarısız olup olmadığını veya ne sıklıkta başarısız olduğunu kontrol etmenizi sağlar (örneğin: "Her gün çalışmam gerekiyordu: ne sıklıkta bunu yapmak için zamanım vardı?").

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.