एक डेटाबेस में व्यापार घंटे का भंडारण


84

मैं वर्तमान में डेटाबेस में किसी व्यवसाय के संचालन के घंटे को स्टोर करने के लिए सबसे अच्छा तरीका निकालने की कोशिश कर रहा हूं।

उदाहरण के लिए:

बिजनेस ए में निम्नलिखित घंटों का संचालन होता है

  • सोमवार: सुबह 9 बजे - शाम 5 बजे
  • मंगलवार: सुबह 9 बजे - शाम 5 बजे
  • बुधवार: सुबह 9 बजे - शाम 5 बजे
  • गुरुवार: सुबह 9 बजे - शाम 5 बजे
  • शुक्रवार: सुबह 9 बजे - शाम 5 बजे
  • शनिवार: सुबह 9 बजे - दोपहर 12 बजे
  • रविवार: बंद

वर्तमान में मेरे पास निम्न के समान एक डेटा मॉडल है

CREATE TABLE "business_hours" (
    "id" integer NOT NULL PRIMARY KEY,
    "day" varchar(16) NOT NULL,
    "open_time" time,
    "close_time" time
)

जहां "दिन" कोड (ओआरएम के माध्यम से) में सप्ताह के 7 दिनों की पसंद तक सीमित है। यह जांचने के लिए कि क्या किसी व्यवसाय को किसी निश्चित दिन बंद कर दिया गया है, यदि यह जांच करता है कि ओपन_टाइम और क्लोज़_टाइम NULL हैं या नहीं। यह इंटरमीडिएट टेबल (कई से कई रिश्ते) के माध्यम से व्यवसाय से संबंधित है।

क्या किसी के पास इस डेटाबेस योजना के लिए कोई सुझाव है? इसके बारे में कुछ मुझे सही नहीं लगता।


4
आपको Business_hours तालिका और व्यवसाय तालिका के बीच M-to-M संबंध की आवश्यकता क्यों है? यदि आप वास्तव में कई व्यवसायों को business_hours में एक ही रिकॉर्ड साझा करने जा रहे हैं, तो क्यों? शब्दार्थ है कि, "कंपनी C, T1 से T2 के दिन D पर काम करती है" बल्कि एक इकाई की तुलना में एक मूल्य-वस्तु है ... एकमात्र अच्छा (?) कारण जिसकी मैं कल्पना कर सकता हूं वह है स्टोरेज साइज ऑप्टिमाइज़ेशन (फ्लाईवेट पैटर्न का RDB संस्करण)? इसलिए बोलना) यदि व्यवसायों की संख्या बहुत अधिक होने की उम्मीद है ...
यारिक

2
लंच ब्रेक के बारे में क्या? सार्वजनिक छुट्टियों के बारे में क्या?
मावग का कहना है कि मोनिका जूल

जवाबों:


56

कुल मिलाकर, मैं इसके साथ कुछ भी गलत नहीं देखता हूं। के सिवाय...

  1. मैं सप्ताह के दिन को एक पूर्णांक के रूप में संग्रहित करूँगा जो आपकी मूल प्रोग्रामिंग भाषा (इसके पुस्तकालयों में) का उपयोग करता है। यह डेटाबेस के आकार को कम करेगा और आपके कोड से स्ट्रिंग तुलना को हटा देगा।

  2. मैं शायद इस तालिका में विदेशी कुंजी व्यापार तालिका में डाल दूंगा। इस तरह आपको लिंक टेबल की आवश्यकता नहीं होगी।

इसलिए मुझे लगता है कि मैं करूँगा:

CREATE TABLE "business_hours" (
     "id" integer NOT NULL PRIMARY KEY,
     "business_id" integer NOT NULL FOREIGN KEY REFERENCES "businesses",
     "day" integer NOT NULL,
     "open_time" time,
     "close_time" time
)

अपने व्यावसायिक तर्क में, मैं एक बाधा को लागू करूंगा कि प्रत्येक "व्यवसाय" में कम से कम 7 "व्यावसायिक घंटे" हैं। ( कम से कम क्योंकि जॉन स्कीट सही है, आप छुट्टी के घंटे चाहते हो सकते हैं।) हालांकि आप इस बाधा को आराम करना चाह सकते हैं कि केवल "व्यवसाय के घंटे" को उन दिनों के लिए बंद कर दिया जाए जो व्यवसाय बंद हैं।


1
आप 2 कैसे करेंगे? दिन / समय समान होने पर भी सभी व्यवसायों के लिए सभी प्रविष्टियाँ होना?
विंको वर्सालोविच

7
मैं हाँ कहूँगा। अन्यथा, इस बात पर विचार करें कि यदि दो व्यवसाय समान घंटे साझा करने के लिए होते हैं, लेकिन तब उनमें से एक को अपने घंटे बदलने की आवश्यकता होती है। आपको इस तथ्य का पता लगाना होगा कि घंटे बदल गए हैं, और या तो एक नया रिकॉर्ड बनाते हैं, या मौजूदा को संपादित करते हैं, इस पर निर्भर करता है कि इसका साझा किया गया है या नहीं।
एरिक फोर्ब्स

3
मैं पूरी तरह से व्यवसायों के बीच इस तालिका की पंक्तियों को साझा नहीं करूंगा। इस तरह के बंटवारे से सिर्फ दर्द होता है। एप्लिकेशन के व्यावसायिक तर्क को केवल उस बाधा को लागू करना चाहिए जिसमें प्रत्येक व्यवसाय में कम से कम 7 "business_hours" संदर्भ हैं।
फ्रैंक क्रूगर

1
@ विन्को: याद रखें कि जबकि मूल्य (वर्तमान में) समान हैं, दो व्यवसायों के लिए शुरुआती घंटे शब्दार्थ रूप से भिन्न हैं।
डेमॉन

1
आप "दिन" के लिए 7 बिट्स के बिटमैप का भी उपयोग कर सकते हैं। इस तरह आपको एक ही प्रविष्टियों को दोहराने की ज़रूरत नहीं है। उदाहरण के लिए सभी कार्यदिवस में एक ही व्यावसायिक घंटे होते हैं, एक प्रविष्टि पर्याप्त है।
ज़ोलकट

28

एक स्थिति जो इस स्कीमा द्वारा कवर नहीं की जाती है वह एक दिन में कई उद्घाटन अवधि है। उदाहरण के लिए, स्थानीय पब 12: 00-14: 30 और 17: 00-23: 00 खुला है।

हो सकता है कि एक थिएटर बॉक्स ऑफिस एक मैटिनी और एक शाम के प्रदर्शन के लिए खुला हो।

उस बिंदु पर आपको यह तय करने की आवश्यकता है कि क्या आपके पास एक ही दिन के लिए कई प्रविष्टियां हो सकती हैं, या यदि आपको एक ही पंक्ति में विभिन्न घंटों का प्रतिनिधित्व करने की आवश्यकता है।

आधी रात को पार करने वाले शुरुआती समय के बारे में क्या। कहते हैं एक बार खुला है 19: 00-02: 00। जिस समय आप परीक्षण करना चाहते हैं, उसके साथ आप उद्घाटन और समापन समय की तुलना नहीं कर सकते।


मैंने @JordanFeldstein जैसा सुझाव देते हुए कुछ किया। मैं "राज्य में परिवर्तन" की सरणियों को संग्रहीत करता हूं, जिसमें परिवर्तन (खुले या करीब), सप्ताह का दिन और दिन का समय शामिल है। मेरे पास प्रत्येक व्यवसाय के लिए और प्रत्येक दिन जितने "परिवर्तन" हो सकते हैं। एक व्यवसाय एक दिन खोल सकता है और अगले को बंद कर सकता है, प्रति दिन दो बार (या एक्स बार) खोल सकता है, 24 घंटे खुला रह सकता है लेकिन सोमवार को बंद हो सकता है, जो भी हो। यह लागू करने के लिए मुश्किल है, लेकिन बहुत लचीला है।
ironcito

सर्वोत्तम उत्तर दृष्टिकोण के बाद, मैं दो कॉलम जोड़ना चाहूंगा business_hours: break_timeऔर break_duration। एक ही दिन में 2 ब्रेक होना वास्तव में दुर्लभ है।
फ्रांउडर

12

यह इस बात पर निर्भर करता है कि आपको इसके लिए क्या संग्रहित करने की आवश्यकता है और वास्तविक-विश्व डेटा कैसा दिख सकता है।
यदि आपको यह निर्धारित करने में सक्षम होने की आवश्यकता है कि क्या व्यापार एक निश्चित बिंदु पर खुला है, तो योजना को निर्धारित करने में थोड़ा अजीब हो सकता है। अधिक महत्वपूर्ण बात, हालांकि, यह है: क्या आपको कभी मिड-डे क्लोजर की आवश्यकता होगी?

कुछ विकल्पों में शामिल हैं;

  • आपके पास क्या है जैसी योजना, लेकिन एक ही दिन के लिए कई अवधि रखने के विकल्प के साथ। यह लंच ब्रेक के लिए पूरा करेगा, लेकिन एक क्वेरी चलाने के लिए अजीब होगा जो आपको किसी दिए गए दिन के लिए शुरुआती घंटे देता है, एक उपयोगकर्ता के लिए प्रस्तुति के लिए कहें।
  • एक बिटमैप शैली दृष्टिकोण; 9-5 के लिए "000000000111111110000000"। इस दृष्टिकोण के लिए नकारात्मक पक्ष यह है कि आपको एक विशिष्ट ग्रैन्युलैरिटी का चयन करना होगा, अर्थात पूरे घंटे या आधे घंटे या, वास्तव में, मिनट। बारीक से बारीक, मानव के लिए पढ़ने के लिए डेटा जितना कठिन है। आप इस मान को पूर्णांक की एक स्ट्रिंग के बजाय एकल मान के रूप में संग्रहीत करने के लिए बिटवाइज़ ऑपरेटरों का उपयोग कर सकते हैं, लेकिन फिर से यह सुस्पष्टता को नुकसान पहुँचाता है।

11

मैंने सीखा है कि यदि आप Google डेटा मार्कअप को अपने डेटा को पहचानना चाहते हैं, तो आपको इन दिशानिर्देशों का पालन करना चाहिए:

https://schema.org/openingHours

http://schema.org/OpeningHoursSpecification में "मान्य दिनांक" शामिल हैं, जो कुछ व्यवसायों के लिए बहुत उपयोगी है।

https://schema.org/docs/search_results.html#q=hours

आपको एक प्राथमिक कुंजी के बिना ठीक होना चाहिए, जब तक कि आप व्यवसायों को शामिल होने की मेज के साथ एक ही घंटे साझा करने की अनुमति नहीं देते हैं - दिलचस्प रूप से अंततः आपके पास संयोजनों की एक सीमित मात्रा होगी; मुझे यकीन नहीं है कि कितने होंगे: पी

अपनी एक परियोजना के साथ मैंने कॉलम का उपयोग किया:

[uInt] business_id, [uTinyInt] दिन, [चार (11)] timeRange

यदि आप OpeningHoursSpecification का समर्थन करना चाहते हैं, तो आपको वैध और वैधता जोड़ना होगा।

समय सीमा इस तरह स्वरूपित है: hh: mm-hh: mm

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

अपने अनुभव से मैं यह सलाह दूंगा कि आप एक दिन में कई बार अनुमति दें, यह बताने का कोई तरीका बताएं कि क्या वे उस दिन स्पष्ट रूप से बंद हैं, या 24 घंटे या 24/7 खोले गए हैं। मेरा कहना था कि अगर डीबी में एक दिन भी गायब था तो उस दिन कारोबार बंद था।

/**
 * parseTimeRange
 * parses a time range in the form of
 * '08:55-22:00'
 * @param $timeRange 'hh:mm-hh:mm' '08:55-22:00'
 * @return mixed ['hourStart'=>, 'minuteStart'=>, 'hourEnd'=>, 'minuteEnd'=>]
 */
function parseTimeRange($timeRange)
{
    // no validating just parsing
    preg_match('/(?P<hourStart>\d{1,2}):(?P<minuteStart>\d{2})-(?P<hourEnd>\d{1,2}):(?P<minuteEnd>\d{2})/', $timeRange, $matches);

    return $matches;
}

1

अधिकांश परिणाम दिए गए परिदृश्य के लिए ठीक काम करते हैं, लेकिन यह तब तक प्रभावी नहीं होगा जब आपके पास कई दिनों से चलने वाली अवधि हो, जैसे। 8:00 पूर्वाह्न ~ 2:00 पूर्वाह्न, फिर मैं एक बहु अवधि डिजाइन का उपयोग करने की सलाह देता हूं।

   0: [
         id: 1,
         business_id: 1,
         open: true,
         day: 1,
         periods: [
             0: { open: 08:00, close: 23:59 }
         ]
      ],
   1: [
         id: 2,
         business_id: 1,
         open: true,
         day: 2,
         periods: [
             0: { open: 00:00, close: 02:00 }
             1: { open: 08:00, close: 23:59 }
         ]
      ]

0

महीने के महीने / दिन / महीने के अतिरिक्त क्षेत्रों को शामिल करके छुट्टियों में फैक्टरिंग के बारे में सोच सकते हैं। महीने के सप्ताह में कुछ मामूली सूक्ष्मताएं होती हैं "अंतिम" उदाहरण के लिए वर्ष के आधार पर सप्ताह 4 या 5 हो सकता है।

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