วิธีการจัดเก็บราคาที่มีวันที่มีผล?


21

ฉันมีรายการผลิตภัณฑ์ ผู้ให้บริการแต่ละรายจะถูกเสนอโดย N

ผู้ให้บริการแต่ละรายเสนอราคาให้เราตามวันที่เฉพาะเจาะจง ราคานั้นจะมีผลจนกว่าผู้ให้บริการรายนั้นจะตัดสินใจกำหนดราคาใหม่ ในกรณีนั้นผู้ให้บริการจะแจ้งราคาใหม่พร้อมวันที่ใหม่

ส่วนหัวของตาราง MySQL ในปัจจุบันดูเหมือนว่า:

provider_id, product_id, price, date_price_effective

ทุก ๆ วันเราจะรวบรวมรายการผลิตภัณฑ์ / ราคาที่มีผลสำหรับวันปัจจุบัน สำหรับแต่ละผลิตภัณฑ์รายการจะมีรายการที่เรียงลำดับของผู้ให้บริการที่มีผลิตภัณฑ์นั้น ๆ ด้วยวิธีนี้เราสามารถสั่งซื้อผลิตภัณฑ์บางอย่างจากใครก็ตามที่เสนอราคาที่ดีที่สุด

เพื่อให้ได้ราคาที่มีประสิทธิภาพผมมีคำสั่ง SQL date_price_effective >= NOW()ที่ส่งกลับแถวทั้งหมดที่มี ชุดผลลัพธ์นั้นถูกประมวลผลด้วยสคริปต์ ruby ​​ซึ่งทำการเรียงลำดับและกรองข้อมูลที่จำเป็นเพื่อรับไฟล์ที่มีลักษณะดังนี้:

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

มันใช้งานได้ดีสำหรับวัตถุประสงค์ของเรา แต่ฉันยังคงมีอาการคันที่ตาราง SQL อาจไม่ใช่วิธีที่ดีที่สุดในการจัดเก็บข้อมูลประเภทนี้ ฉันมีความรู้สึกว่าปัญหาแบบนี้ได้รับการแก้ไขก่อนหน้านี้ในรูปแบบที่สร้างสรรค์มากขึ้น

มีวิธีที่ดีกว่าในการจัดเก็บข้อมูลนี้นอกเหนือจากใน SQL? หรือถ้าใช้ SQL มีวิธีที่ดีกว่าที่ฉันใช้อยู่หรือไม่?


lal00: ​​ดังที่ฉันได้กล่าวถึงในความคิดเห็นของฉันฉันจัดการกับการออกเดทที่มีประสิทธิภาพเป็นประจำ โปรดดูคำตอบของฉันสำหรับวิธีการจัดการวันที่ง่ายอย่างมีประสิทธิภาพ ไม่จำเป็นต้องรู้ระยะเวลาที่ราคามีผลบังคับใช้เมื่อสร้างแถวราคาใหม่และไม่ต้องการให้ย้อนกลับไปแก้ไขแถวปัจจุบันล่าสุดก่อนหน้าเมื่อสร้างแถวใหม่
bit-twiddler

คำตอบ:


17

สำหรับรายการที่แตกต่างกันไปตามเวลา (เช่นความสามารถในการตอบสิ่งต่าง ๆ เช่น "ราคา X ณ วันที่ D" หรือ "วัวตัวใดที่อยู่ใน feedlot Q ในวันที่ E") ฉันแนะนำให้อ่านหนังสือ "การพัฒนาตามเวลา แอปพลิเคชันฐานข้อมูลใน SQL " ในขณะที่หนังสือเล่มนี้พิมพ์ออกมาผู้เขียนได้จัดทำ PDF ของหนังสือและซีดีที่เกี่ยวข้องบนเว็บไซต์ของเขา

http://www.cs.arizona.edu/~rts/publications.html (มองหารายการแรกภายใต้ "books")

สำหรับการแนะนำสั้น ๆ ทางออนไลน์ดู:


1
นี่ไม่ใช่สิ่งที่ฉันคิดไว้ในใจเมื่อฉันถามจะดีกว่า! :)
edmz

3

แน่นอนฉันจะเก็บวันที่มีผลในฐานข้อมูล ท้ายที่สุดมีแนวโน้มว่าผู้คนจะต้องการเรียกใช้แบบสอบถามเพื่อดูว่าราคามีการเปลี่ยนแปลงอย่างไรเมื่อเวลาผ่านไปหรือตรวจสอบความแปลกแยกในการสั่งซื้อกับตารางราคาผลิตภัณฑ์ในอดีต ขึ้นอยู่กับประเภทของคำค้นหาที่คุณใช้และความถี่ของการเปลี่ยนแปลงราคามันอาจสมเหตุสมผลที่จะมีตารางแยกต่างหากสำหรับราคาปัจจุบันและราคาในอดีต

ในระบบส่วนใหญ่ที่เก็บราคาคุณจะต้องการคอลัมน์วันที่หมดอายุนอกเหนือจากวันที่มีผลบังคับใช้เพื่อให้ง่ายต่อการพิจารณาว่าราคาใดที่มีผลบังคับใช้ในปัจจุบันเนื่องจากช่วยให้คุณไม่ต้องมองแถวก่อนหรือแถวถัดไป ราคาที่มีผลในช่วงเวลาที่กำหนด ฉันไม่ชัดเจนว่าNOW() >= date_price_effectiveสภาพของคุณกำลังทำอะไร - สมมุติว่าคืนราคาปัจจุบันพร้อมกับราคาย้อนหลังที่ผ่านมาทั้งหมดซึ่งดูแปลกสำหรับฉัน ฉันคิดว่า "ราคาที่มีประสิทธิภาพ" จะเป็นราคาปัจจุบันซึ่งจะถูกกำหนดโดยบางสิ่งบางอย่างเช่นNOW() BETWEEN date_price_effective AND date_price_expired

ฉันยังไม่แน่ใจว่าไฟล์ของคุณควรมีหน้าตาเป็นอย่างไร มันไม่ชัดเจนให้ฉันสิ่งprovider_1represents-- provider_id = 1 ราคา -? หรือวิธีการที่คุณสั่งซื้อ data-- ผู้ให้บริการที่ว่าทำไมไม่provider_1ปรากฏเป็นครั้งแรกสำหรับและที่สามสำหรับ product_id_1product_id_2


จัสตินวันที่หมดอายุทำให้รู้สึก คุณพูดถูกฉันมี SQL อย่างอื่น ไฟล์ผลลัพธ์นั้นไม่เกี่ยวข้องกับคำถามของฉันฉันเพิ่งเพิ่มเป็นวิธีที่จะเป็นตัวอย่างว่าฉันต้องการเรียงลำดับผลิตภัณฑ์ตามราคา
edmz

หนึ่งไม่จำเป็นต้องรวมวันที่หมดอายุในแต่ละแถวเช่นเดียวกับการเพิ่มค่าใช้จ่ายเพิ่มเติมเป็นหนึ่งมักจะไม่ได้รับระยะเวลาราคาจะมีผลเมื่อแถวถูกสร้างขึ้น หากเรามีแถว N แถวสำหรับแต่ละคู่ producer_id / product_id ในตารางแต่ละแถวจะมีผลในวันที่แน่นอนแถวที่มีค่ามากที่สุด date_price_effective ที่น้อยกว่าหรือเท่ากับวันที่ที่กำหนดคือราคาที่มีผลต่อ วันนั้น หากคุณดูที่โพสต์ของฉันคุณจะเห็นรหัส SQL ที่ทำแบบสอบถามประเภทนี้ ฉันต้องจัดการกับวันที่มีผลเป็นประจำ
bit-twiddler

@ bit-twiddler - แน่นอนว่ามันไม่จำเป็นต้องมีวันหมดอายุ อย่างไรก็ตามการมีวันที่หมดอายุโดยทั่วไปจะทำให้การสืบค้นตารางง่ายขึ้นและมีประสิทธิภาพมากขึ้น เนื่องจากโดยทั่วไปการสืบค้นวันที่มีประสิทธิภาพนั้นมักพบได้บ่อยกว่าการเปลี่ยนแปลงราคาซึ่งโดยทั่วไปจะเป็นการแลกเปลี่ยนที่ฉันยินดีทำ
Justin Cave

3

หากฉันเข้าใจคำแถลงปัญหาของคุณอย่างถูกต้องคุณต้องมีวิธีจัดการกับข้อมูลทั่วไป (เช่นตารางมีหลายแถวสำหรับแต่ละคู่ของ provider_id / product_id ซึ่งแต่ละคู่เป็นวันที่อ่อนไหว) ในกรณีนี้คุณกำลังมองหาราคาล่าสุดสำหรับผลิตภัณฑ์ที่มีค่า date_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 ที่มากกว่าวันนี้เป็นวันที่มีผลในอนาคต รหัสที่แสดงรายการข้างต้นส่งคืนข้อมูลแถวสำหรับแต่ละคู่ Provider_id / product_id ที่มีค่า date_price_effective ที่ใกล้เคียงที่สุด แต่ไม่ช้ากว่าวันที่เรียกใช้แบบสอบถาม โซลูชันจะใส่ราคาลงในช่วงวันที่ที่มีประสิทธิภาพโดยอัตโนมัติ คีย์หลักสำหรับตารางนี้จะเป็นสาม {provider_id, product_id, date_price_effective};

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.