ฉันกำลังทำงานออกแบบฐานข้อมูลอย่างง่ายเป็นแบบฝึกหัดการฝึกอบรมซึ่งฉันต้องออกแบบโครงสร้างพื้นฐานสำหรับกรณีต่อไปนี้:
ฉันมีลำดับชั้นของผลิตภัณฑ์หลัก (ตัวอย่างเช่นวัตถุดิบ> งานระหว่างทำ> ผลิตภัณฑ์สุดท้าย)
- คำสั่งซื้อจะถูกวางไว้ในแต่ละระดับ
- จำนวนการสั่งซื้อจะสามารถดูได้ในที่เก็บข้อมูลรายสัปดาห์ในอีก 6 เดือนข้างหน้า
- การคาดการณ์ความต้องการสามารถทำได้สำหรับแต่ละระดับผลิตภัณฑ์
- การพยากรณ์อุปสงค์สำหรับสัปดาห์ใด ๆ ภายใน 6 เดือนข้างหน้าสามารถทำได้ในวันนี้
- การพยากรณ์ความต้องการใช้สำหรับถังข้อมูลรายสัปดาห์ในอีก 6 เดือนข้างหน้า
การพยากรณ์ความต้องการมักจะทำในระดับที่สูงขึ้นในลำดับชั้น (วัตถุดิบหรืองานในระดับความคืบหน้า) จะต้องมีการแยกออกเป็นระดับที่ต่ำกว่า (ผลิตภัณฑ์สุดท้าย)
มี 2 วิธีที่การพยากรณ์ความต้องการสามารถแยกจากระดับที่สูงขึ้นไปถึงระดับที่ต่ำกว่าได้:
- ผู้ใช้ระบุเปอร์เซ็นต์การกระจายสำหรับผลิตภัณฑ์สุดท้าย สมมติว่ามีการคาดการณ์ 1,000 รายการสำหรับความคืบหน้าในการทำงาน .. และผู้ใช้บอกว่าฉันต้องการ 40% สำหรับผลิตภัณฑ์ขั้นสุดท้าย 1 และ 60% สำหรับผลิตภัณฑ์ขั้นตอนที่ 2 ในที่เก็บข้อมูล 10 .. จากนั้นสำหรับสัปดาห์ที่ 10 (วันอาทิตย์ถึงวันเสาร์) นับจากนี้ สำหรับผลิตภัณฑ์สุดท้าย 1 จะเป็น 400 และสำหรับผลิตภัณฑ์สุดท้าย 2 จะเป็น 600
- ผู้ใช้บอกว่าแยกตัวตามคำสั่งที่วางไว้กับผลิตภัณฑ์สุดท้ายใน Bucket 5 และคำสั่งซื้อใน bucket 5 สำหรับ End ผลิตภัณฑ์ 1 และ 2 คือ 200 และ 800 ตามลำดับดังนั้นค่าการคาดการณ์สำหรับ EP1 จะเป็น (200/1000) * 100)% และสำหรับ EP2 จะเป็น ((800/1000) * 100)% ของการคาดการณ์สำหรับ 'งานระหว่างทำ'
การพยากรณ์จะสามารถดูได้ในที่เก็บข้อมูลรายสัปดาห์ในอีก 6 เดือนข้างหน้าและรูปแบบที่เหมาะสมควรเป็น:
product name | bucket number | week start date | week end date | forecast value | created_on
ตารางPRODUCT_HIERARCHYอาจมีลักษณะเช่นนี้:
id | name | parent_id
__________________________________________
1 | raw material | (null)
2 | work in progress | 1
3 | end product 1 | 2
4 | end product 2 | 2
ตารางคำสั่งซื้ออาจมีลักษณะเช่นนี้:
id | prod_id | order_date | delivery_date | delivered_date
ที่ไหน
prod_id
เป็นรหัสต่างประเทศที่อ้างอิงถึงid
ตาราง PRODUCT_HIERARCHY
วิธีจัดเก็บการคาดการณ์ สิ่งที่จะเป็นสคีพื้นฐานที่ดีสำหรับความต้องการดังกล่าว?
ความคิดของฉันในการเลือกคำสั่งซื้อสำหรับ 26 ถังรายสัปดาห์คือ:
SELECT
COUNT(*) TOTAL_ORDERS,
WIDTH_BUCKET(
delivery_date,
SYSDATE,
ADD_MONTHS(sysdate, 6),
TO_NUMBER( TO_CHAR(SYSDATE,'DD-MON-YYYY') - TO_CHAR(ADD_MONTHS(sysdate, 6),'DD-MON-YYYY') ) / 7
) BUCKET_NO
FROM
orders_table
WHERE
delivery_date BETWEEN SYSDATE AND ADD_MONTHS(sysdate, 6);
แต่นี่จะให้ถังรายสัปดาห์เริ่มตั้งแต่วันนี้โดยไม่คำนึงถึงวัน ฉันจะแปลงเป็นวันอาทิตย์ถึงวันเสาร์ใน Oracle ได้อย่างไร
โปรดช่วยออกแบบโครงสร้างฐานข้อมูลนี้
(จะใช้ Oracle 11g)