प्रभावी तिथियों वाले मूल्यों को कैसे स्टोर करें?


21

मेरे पास उत्पादों की एक सूची है। उनमें से प्रत्येक एन प्रदाताओं द्वारा की पेशकश की है।

प्रत्येक प्रदाता हमें एक विशिष्ट तिथि के लिए एक मूल्य उद्धृत करता है। वह मूल्य तब तक प्रभावी होता है जब तक कि प्रदाता नई कीमत निर्धारित करने का निर्णय नहीं लेता। उस स्थिति में, प्रदाता नई तारीख के साथ नई कीमत देगा।

MySQL टेबल हेडर वर्तमान में जैसा दिखता है:

provider_id, product_id, price, date_price_effective

हर दूसरे दिन, हम उन उत्पादों / कीमतों की एक सूची संकलित करते हैं जो वर्तमान दिन के लिए प्रभावी हैं। प्रत्येक उत्पाद के लिए, सूची में उन प्रदाताओं की क्रमबद्ध सूची होती है जिनके पास वह विशेष उत्पाद होता है। इस तरह, हम कुछ उत्पादों को ऑर्डर कर सकते हैं जो कोई भी सबसे अच्छी कीमत की पेशकश करता है।

प्रभावी मूल्य प्राप्त करने के लिए, मेरे पास एक SQL स्टेटमेंट है जो सभी पंक्तियों को लौटाता है date_price_effective >= NOW()। उस परिणाम सेट को एक रूबी स्क्रिप्ट के साथ संसाधित किया जाता है जो एक फाइल प्राप्त करने के लिए आवश्यक छंटाई और फ़िल्टरिंग करता है जो इस तरह दिखता है:

product_id_1,provider_1,provider_3,provider8,provider_10...
product_id_2,provider_3,provider_2,provider1,provider_10...

यह हमारे उद्देश्यों के लिए ठीक काम करता है, लेकिन मेरे पास अभी भी एक खुजली है कि इस तरह की जानकारी संग्रहीत करने के लिए एक SQL तालिका शायद सबसे अच्छा तरीका नहीं है। मुझे लगता है कि इस तरह की समस्या पहले से ही अन्य रचनात्मक तरीकों से हल हो गई है।

क्या SQL के अलावा इस जानकारी को संग्रहीत करने का कोई बेहतर तरीका है? या, यदि SQL का उपयोग किया जाता है, तो क्या मैं जो उपयोग कर रहा हूं, उससे बेहतर दृष्टिकोण है?


lal00: ​​जैसा कि मैंने अपनी एक टिप्पणी में उल्लेख किया है, मैं नियमित रूप से प्रभावी डेटिंग को संभालता हूं। कृपया एक सरल प्रभावी तिथि हैंडलिंग विधि के लिए मेरा उत्तर देखें। यह उस अवधि को जानने के लिए किसी की आवश्यकता नहीं है जब एक नई मूल्य पंक्ति बनाई जाती है, तो एक मूल्य प्रभावी होता है, और न ही किसी नई पंक्ति के बनने पर पिछली सबसे वर्तमान पंक्ति को संशोधित करने के लिए इसे वापस लेने की आवश्यकता होती है।
बिट-ट्विडलर

जवाबों:


17

उन वस्तुओं के लिए जो समय के आधार पर बदलती हैं (जैसे कि "D पर X की कीमत क्या है" जैसी चीजों का उत्तर देने में सक्षम होने के कारण "या" कौन सी गाय फीडलॉट Q में तारीख E पर थी ") मैं पुस्तक को पढ़ने की सलाह देता हूं" विकासशील समय-उन्मुख SQL में डेटाबेस अनुप्रयोग। " जबकि यह पुस्तक प्रिंट से बाहर है, लेखक ने बड़ी विनम्रता से पुस्तक के पीडीएफ के साथ-साथ उसकी वेबसाइट पर संबंधित सीडी भी उपलब्ध करा दी है।

http://www.cs.arizona.edu/~rts/publications.html ("पुस्तकों" के तहत पहला आइटम देखें)।

ऑनलाइन संक्षिप्त परिचय के लिए, देखें:


1
खैर, यह वह नहीं है जो मैंने पूछा था जब मैंने पूछा था, तो यह बेहतर है! :)
edmz

3

मैं निश्चित रूप से डेटाबेस में प्रभावी तिथि संग्रहीत करूँगा। आखिरकार, यह संभावना है कि लोग ऐतिहासिक उत्पाद मूल्य तालिका के खिलाफ आदेशों में समय के साथ या विषमताओं को पार करने के लिए यह देखने के लिए प्रश्नों को चलाने में सक्षम होना चाहते हैं। आपके द्वारा चलाए जा रहे प्रश्नों के प्रकार और मूल्य परिवर्तन की आवृत्ति के आधार पर, वर्तमान मूल्य और ऐतिहासिक कीमतों के लिए अलग-अलग तालिकाओं का होना समझ में आता है।

अधिकांश प्रणालियों में जो कीमतें संग्रहीत करते हैं, आप प्रभावी तिथि के अलावा एक समाप्ति तिथि कॉलम चाहते हैं जिससे यह निर्धारित करना आसान हो कि वर्तमान में कौन सी कीमत प्रभावी है क्योंकि यह आपको पहले या अगली पंक्ति को देखने के लिए होने की परेशानी से बचाता है। किसी निश्चित समय में कौन सी कीमत प्रभावी थी। मैं स्पष्ट नहीं कर रहा हूं कि आपकी NOW() >= date_price_effectiveस्थिति क्या है- संभवतया, यह मौजूदा कीमत के साथ-साथ सभी पूर्व ऐतिहासिक कीमतों के साथ लौटता है जो मुझे अजीब लगता है। मुझे लगता है कि "प्रभावी मूल्य" वर्तमान मूल्य होगा जिसे कुछ इस तरह से परिभाषित किया जाएगाNOW() BETWEEN date_price_effective AND date_price_expired

मुझे यह भी निश्चित नहीं है कि आपकी फ़ाइल कैसी दिखनी चाहिए। यह मेरे लिए स्पष्ट नहीं है कि क्या provider_1प्रतिनिधित्व करता है-- provider_id = 1 मूल्य? - या आप प्रदाता डेटा को कैसे ऑर्डर कर रहे हैं - यह provider_1पहली बार product_id_1और तीसरे के लिए क्यों दिखाई देता है product_id_2


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

प्रत्येक पंक्ति में एक समाप्ति तिथि को शामिल करने की आवश्यकता नहीं होती है, क्योंकि ऐसा करने से केवल अतिरिक्त ओवरहेड जुड़ता है, क्योंकि आमतौर पर एक अवधि नहीं दी जाती है जब पंक्ति बनाई जाती है तो एक मूल्य प्रभावी होता है। यदि हमारे पास तालिका में प्रत्येक निर्माता_ / / product_id जोड़ी के लिए N पंक्तियाँ हैं, जिनमें से प्रत्येक एक निश्चित तिथि पर प्रभावी है, तो सबसे बड़ी date_price_effective मान वाली पंक्ति जो किसी दिनांक से कम या बराबर है, वह मूल्य है जो प्रभाव में है उस तारीख। यदि आप मेरी पोस्टिंग को देखते हैं, तो आपको SQL कोड दिखाई देगा जो इस प्रकार का क्वेरी करता है। मुझे नियमित आधार पर प्रभावी तारीखों से निपटना होगा।
बिट-ट्विडलर

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

3

यदि मैं आपके समस्या कथन को सही ढंग से समझता हूं, तो आपको जेनिटल डेटा (यानी, तालिका में प्रत्येक प्रदाता_आईडी / product_id जोड़ी के लिए कई पंक्तियाँ हैं, जिनमें से प्रत्येक तिथि संवेदी है) को संभालने की आवश्यकता है। उस स्थिति में, आप किसी दिनांक_price_effective मान वाले उत्पाद के लिए सबसे हाल के मूल्य की तलाश कर रहे हैं जो आज की तुलना में कम या बराबर है। SQL सबसिलेक्ट का उपयोग करके इस तरह की स्थिति को आसानी से नियंत्रित किया जाता है।

 SELECT 
   provider_id, product_id, price, date_price_effective 
 FROM 
   price_table a 
 WHERE 
   date_price_effective = 
     (
       SELECT 
         MAX(date_price_effective) 
       FROM 
         price_table b 
       WHERE 
         b.provider_id = a.provider_id AND 
         b.product_id = a.product_id AND
         b.date_price_effective <= NOW() 
     );

एक मूल्य तब तक प्रभावी होता है जब तक उसमें सबसे बड़ी date_price_effective वैल्यू होती है जो क्वेरी निष्पादित होने की तारीख से कम या उसके बराबर होती है। एक date_price_effective मान जो आज की तुलना में अधिक है, भविष्य की प्रभावी तारीख है। ऊपर सूचीबद्ध कोड प्रत्येक प्रदाता_आईडी / product_id जोड़ी के लिए पंक्ति डेटा देता है जिसमें दिनांक_price_effective मान होता है जो निकटतम होता है, लेकिन क्वेरी निष्पादित होने की तारीख से बाद में नहीं। समाधान स्वचालित रूप से प्रभावी तिथि सीमा में कीमतों को कोष्ठक करता है। इस तालिका की प्राथमिक कुंजी ट्रिपल {प्रोवाइडर_एड, प्रोडक्ट_िड, डेट_प्राइस_फैक्टिव} होगी;

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