डेटाबेस में दोहराए जाने वाले कैलेंडर कार्यों को कैसे संग्रहीत किया जाना चाहिए?


14

यह माइक्रो-मैनेजमेंट के लिए एक छोटे से निजी प्रोजेक्ट के लिए है। मूल रूप से, मैं SQLite3 डेटाबेस में कार्यों को संग्रहीत करता हूं जो इस तरह दिखता है:

    id INTEGER PRIMARY KEY AUTOINCREMENT
    label TEXT
    deadline INTEGER

इसलिए प्रत्येक कार्य की एक नियत तारीख (समय सीमा) होती है जिसे यूनिक्स टाइम स्टैम्प के रूप में संग्रहीत किया जाता है। अब तक अच्छा है, मैं "कल: यात्रा दादी" जैसी प्रविष्टियाँ कर सकता हूं और "विजिट दादी" के साथ लेबल के रूप में एक नई पंक्ति बन जाती है और कल समय सीमा के लिए यूनिक्स समय के रूप में परिवर्तित हो जाता है।

अब मैं नए प्रकार के कार्यों में प्रवेश करना चाहूंगा: दिनचर्या - समय पैटर्न पर दोहराए जाने वाले कार्य, जैसे "हर रोज: स्वच्छ रसोई"। ऐसे कार्यों को कैसे संग्रहीत या मॉडलिंग किया जा सकता है?

फिलहाल, मैं सोच रहा हूं कि, एक कार्य के मामले में, जिसे हर रोज करने की आवश्यकता है, मेरी तालिका में नई पंक्तियों को उत्पन्न करने के लिए जिसमें एक ही लेबल होगा, और एक दिन की समय सीमा बढ़ेगी। इस मामले में, मुझे भविष्य में एक सीमा तय करने की आवश्यकता है। उदाहरण के लिए, यदि मैं हर दिन के लिए एक दिनचर्या बनाता हूं, तो यह शेष वर्ष के रोज़ के लिए एक नई पंक्ति बनाता है।

क्या ऐसा करने का कोई सरल तरीका है? क्या मुझे कुछ स्पष्ट डेटाबेस डिजाइन सिद्धांतों की याद आ रही है?


3
हाँ। एक और जॉब शेड्यूलर का आविष्कार करने के बजाय एक उचित अनुसूचक उपकरण का उपयोग करें। SOPA विरोध समाप्त होने के बाद, en.wikipedia.org/wiki/Open_Source_Job_Scheduler पढ़ें । यह हल किया गया है, अच्छी तरह से, पहले से ही बहुत बार।
एस.लॉट

बहुत बहुत धन्यवाद! हाँ मुझे संदेह था कि इसके लिए एक सुंदर समाधान था! मैं SOPA के अंत का इंतजार करूंगा या जांच करूंगा कि क्या अन्य विकिपीडिया देशों में अनुवाद है: वास्तव में ive अभी देखा कि HTML स्रोत अभी भी विकिपीडिया यूएस में उपलब्ध है, ब्लैक आउट स्क्रीन सीएसएस ट्रिक की तरह है, मैं अपने पर हूं एक छोटी चिकना स्क्रिप्ट के लिए रास्ता :)
फ्रांस्वा ت वेस्पा

1
सामान्य नोट: नीचे दिए गए अधिकांश पोस्ट इस सवाल को ध्यान में नहीं रखते हैं कि डेटा वास्तव में कैसे संग्रहीत किया जाता है। मेरा मतलब है कि एक ऐसा काम जो 2 साल तक हर सोमवार को दोहराया जाता है, उसे डिस्क पर कितनी पंक्तियों को लिखना होगा?
NoChance


@ रूट 45 अच्छा, मैं वास्तव में कमांड लाइन से लिंक्स का उपयोग करता हूं, और भी आसान :)
फ्रांकोइस a वेस्पा

जवाबों:


7

आप पुनः प्राप्ति के लिए एक अलग तालिका बना सकते हैं। लेकिन ईमानदारी से कहूं तो मैं इसे एक ही फील्ड में टाइप फील्ड के साथ जोड़ूंगा।

कुछ इस तरह:

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 

दिलचस्प है, मैं वास्तव में इस एक के समान एक संभावित समाधान तलाश रहा हूं, मैं अभी भी अपने एसक्यूएल कार्यों पर काम कर रहा हूं, मैं सफल होने पर पोस्ट करूंगा
फ्रैंकोइस ois वेस्पा

दिलचस्प है, मैं उस क्वेरी के साथ आने की कोशिश कर रहा हूं जो आवर्ती और गैर-आवर्ती दोनों कार्यों को प्राप्त कर सकती है और फिर उनकी नियत तिथि तक उन्हें सॉर्ट कर सकती है। कोई सुराग?
हर्षल पाटिल

2

एस.लॉट, मार्टिन फाउलर की टिप्पणी के अलावा - कैलेंडर्स पीडीएफ के लिए आवर्ती घटना आपकी मदद कर सकती है (मुझे यह थोड़ा मुश्किल लगा)।

यह भी ध्यान दें कि कई UI टूल फ़ंक्शन को बॉक्स से बाहर (सरल कार्य मॉडल के साथ) बता रहे हैं। मैं इस समस्या को ऐसे उपकरणों के बिना डेटाबेस डिजाइन समस्या को हल करने के लिए एक कठिन के रूप में विचार करूंगा।


1

मेरे विचार में दो विकल्प हैं:

  • Reoccurring आइटम के लिए समान पंक्तियों की एक बड़ी मात्रा को संग्रहीत करें, हालांकि उन्हें समाप्त करना होगा (या तो समाप्ति तिथि, या आइटम की एक सीमित संख्या के माध्यम से), और उन्हें reoccurring आइटम के रूप में चिह्नित करना होगा। जब आप ईवेंट बदलते हैं, तो आपको उन सभी को अपडेट करना होगा, लेकिन जब आप एक बार विचलन करना चाहते हैं, तो आप बस एक ईवेंट के बीच कनेक्शन को 'ब्रेक' कर सकते हैं, और इसे एक सामान्य ईवेंट बना सकते हैं।
  • ईवेंट को एक पुनरावर्ती आइटम के रूप में संग्रहीत करें, एक निश्चित पुनरावृत्ति योजना के साथ, और दिए गए दिनांक के लिए गणना करें जो दिए गए दिनांक पर पुन: आवर्ती आइटम हैं। यह अनंत पुनरावृत्ति की संभावना देता है।

इस तरह से मैं इसे भी देखता हूं
फ्रांस्वा ッ वेस्पा

1

यदि यह एक व्यक्तिगत परियोजना है और आप बस अपने कार्यों को संग्रहीत करने का एक तरीका चाहते हैं, तो मैं TaskCoach की सलाह देता हूं । यह एक डेस्कटॉप एप्लिकेशन, मल्टी-प्लेटफ़ॉर्म, ओपन सोर्स, आरंभ करने में आसान और वास्तव में अच्छी विशेषताएं हैं।

यदि आप एक कार्य अनुप्रयोग विकसित कर रहे हैं, तो सबसे संभावित तरीका प्रत्येक आवर्ती कार्य के लिए एक नई पंक्ति जोड़ना है। तर्क यह है कि प्रत्येक कार्य अपने आप में एक अलग इकाई है और इसे उसी कार्य के अगले दिन शुरू होने से पहले पूरा करना होगा। यदि आप इसे बढ़ाते हैं, तो आप कार्य के इतिहास को नहीं पकड़ सकते।

यदि आप महसूस करते हैं, कि यह आपको एक बड़ी सूची देगा यदि कुछ कार्य पूर्ण नहीं हुए थे, तो आप पुनरावर्ती कार्य पूरा होने के बाद एक घटना को ट्रिगर कर सकते हैं ताकि नया कार्य नई पंक्ति के रूप में तभी उत्पन्न हो जब कार्य हो पूर्ण के रूप में चिह्नित। जैसा कि मोरों द्वारा सुझाया गया है, आप पुनरावृत्ति (दिन, सप्ताह, पुनरावृत्ति समय) के लिए डेटा के साथ मूल तालिका में आवर्ती कार्यों के लिए एक ध्वज के साथ एक अलग तालिका का उपयोग कर सकते हैं ताकि आपके पास बस एक साधारण स्क्रिप्ट हो सके जो आवर्ती कार्यों को आधारित कर सके। दिनांक या एक शर्त या लेबल द्वारा।

लेकिन अगर आपको यकीन है कि यह कार्य एक निश्चित दोहराव है, जिसमें बिना किसी परिवर्तन (जैसे कि दैनिक ब्रश) और व्यापक ट्रैकिंग की आवश्यकता नहीं है, तो आप बस निम्नलिखित संरचना की कोशिश कर सकते हैं

  • पुनरावृत्ति ध्वज - यह इंगित करने के लिए कि कार्य आवर्ती है
  • पुनरावृत्ति की अवधि - दिन, सप्ताह, महीना
  • बनाए गए कार्यों की संख्या - यह पुनरावृत्ति अवधि के आधार पर कार्य में वृद्धि करेगा। इसलिए यदि कार्य आज शुरू होता है और एक दिन की पुनरावृत्ति अवधि होती है, तो यह केवल एक कल की वृद्धि होगी
  • पूर्ण किए गए कार्यों की संख्या - यदि कार्य पूरा हो जाता है तो यह वृद्धि होगी

तर्क पूर्ण किए गए कार्यों के बीच का अंतर है और बनाए गए कार्यों को हमेशा पुनरावृत्ति अवधि होना चाहिए यदि कार्य हमेशा पूरा होता है। इसलिए पुनरावृत्ति अवधि के दिनों के अंतर को विभाजित करने से आपको संकेत मिलेगा कि कार्य कितने समय से लंबित है।

इसे इंगित करने के लिए करीम को धन्यवाद

IMHO, कार्य अनुप्रयोगों को बड़े पैमाने पर लोगों के लिए बनाना मुश्किल है।


रचनात्मक उत्तर के लिए धन्यवाद! यह मौज-मस्ती के लिए एक परियोजना है और मैं इसे यथासंभव लचीला बनाना चाहता हूं, जैसे कि 'हर 4 दिनों में दोहराया जाए, सिवाय इसके कि यह एक वेडनेसडे है'
फ्रैंकोइस a वेस्पा

1

अब तक का सबसे लगातार ऑपरेशन एक समय अवधि में होने वाली सभी घटनाओं को सूचीबद्ध करना होगा। इसलिए अपने डेटा को ऑप्टिमाइज़ करें ताकि प्रश्न का उत्तर एक सरल SQL क्वेरी द्वारा दिया जा सके। मैं दो टेबल बनाऊंगा:

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

ईवेंट तालिका को प्रारंभ और समाप्ति समय तक अनुक्रमित करें। तब सभी प्रश्नों का उत्तर ईवेंट टेबल से बहुत जल्दी दिया जा सकता है। जब एक पुनरावृत्ति संपादित की जाती है, तो बस हटाएं और सभी संबंधित घटनाओं को फिर से बनाएँ।

यह सलाह बेशर्मी से टॉम काइट की एक किताब से दोहराई गई है।


1

बार-बार किए जाने वाले कार्यों की एक आरंभ तिथि और अंतिम तिथि होनी चाहिए। एक ही कार्य के लिए वे एक ही तिथि होंगे।

कुछ प्रकार की "तिथियां" तालिका बनाएं, जिसमें आपके विचार में हर दिन के लिए एक रिकॉर्ड है जो भविष्य में आपकी आवश्यकताओं की शुरुआत से प्रासंगिक है जैसा कि आप चाहते हैं: उदाहरण के लिए 12/31/2100 और अपने प्रारूप में परिवर्तित करें।

एक क्वेरी की तरह लग सकता है:

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

मैंने कुछ साल पहले विंडोज टास्क शेड्यूलर की तरह एक इंटरफ़ेस लागू किया है और मूल रूप से प्रत्येक कार्य के लिए आपके पास StartDate, EndDate (शून्य हो सकता है), StartTime और RecurringDays हैं जिसमें सप्ताह के दिन होते हैं जब कार्य निर्धारित होना चाहिए।


यह तो दिलचस्प है। क्या कुछ डिज़ाइन सीमाएँ, यानी क्वेरीज़ जो नहीं की जा सकती थीं (जैसे 'हर सप्ताह दोहराए जाने के लिए')?
फ्रांस्वा a वेस्पा

0

आप दो तालिकाओं का उपयोग कर सकते हैं: कार्यों के विवरण के लिए एक, उनकी स्थिति के लिए अन्य (किया / नहीं किया गया, और अन्य जानकारी: समय व्यतीत होने, बाहर निकलने की स्थिति, लॉग फ़ाइल का स्थान, आदि) विवरण तालिका में शामिल होगा कार्य का नाम और दिनांक या आवृत्ति जिस पर इसे चलाया जाना चाहिए: प्रति कार्य केवल एक पंक्ति होगी। हर दिन, एक प्रक्रिया विवरण तालिका से (आज आप एक सप्ताह या एक महीने पहले आबाद कर सकती है) कार्यों के लिए स्थिति तालिका को पॉप्युलेट करेगी।

प्रोग्राम टेबल को प्रोग्रामेटिक रूप से जनरेट करने से आपको फ्रीक्वेंसी के लिए इच्छित सभी लचीलेपन मिलते हैं (उदाहरण के लिए, "हर हफ्ते देश की एक्स के लिए बैंक की छुट्टियों को छोड़कर" - इसे स्ट्रिंग के रूप में भी संग्रहीत किया जा सकता है)। एक स्थिति तालिका होने से आपको यह जांचने की अनुमति मिलती है कि कार्य कितनी बार विफल हुआ है (उदाहरण के लिए: "मुझे हर दिन चलना चाहिए था: मेरे पास इसे करने के लिए कितनी बार समय था?")।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.