การออกแบบโครงสร้างอย่างง่ายสำหรับการแยกแยะการพยากรณ์อุปสงค์


9

ฉันกำลังทำงานออกแบบฐานข้อมูลอย่างง่ายเป็นแบบฝึกหัดการฝึกอบรมซึ่งฉันต้องออกแบบโครงสร้างพื้นฐานสำหรับกรณีต่อไปนี้:

ฉันมีลำดับชั้นของผลิตภัณฑ์หลัก (ตัวอย่างเช่นวัตถุดิบ> งานระหว่างทำ> ผลิตภัณฑ์สุดท้าย)

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

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

มี 2 ​​วิธีที่การพยากรณ์ความต้องการสามารถแยกจากระดับที่สูงขึ้นไปถึงระดับที่ต่ำกว่าได้:

  1. ผู้ใช้ระบุเปอร์เซ็นต์การกระจายสำหรับผลิตภัณฑ์สุดท้าย สมมติว่ามีการคาดการณ์ 1,000 รายการสำหรับความคืบหน้าในการทำงาน .. และผู้ใช้บอกว่าฉันต้องการ 40% สำหรับผลิตภัณฑ์ขั้นสุดท้าย 1 และ 60% สำหรับผลิตภัณฑ์ขั้นตอนที่ 2 ในที่เก็บข้อมูล 10 .. จากนั้นสำหรับสัปดาห์ที่ 10 (วันอาทิตย์ถึงวันเสาร์) นับจากนี้ สำหรับผลิตภัณฑ์สุดท้าย 1 จะเป็น 400 และสำหรับผลิตภัณฑ์สุดท้าย 2 จะเป็น 600
  2. ผู้ใช้บอกว่าแยกตัวตามคำสั่งที่วางไว้กับผลิตภัณฑ์สุดท้ายใน 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)


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

คำตอบ:


1

ตกลงดังนั้นนี่คือแบบจำลองข้อมูลที่ฉันสร้างขึ้น

PRODUCT - เพื่อจัดเก็บข้อมูลผลิตภัณฑ์และรักษาลำดับชั้นของแม่ลูก

id  NUMBER  "Primary Key Not Null"                  
level_code  VARCHAR2    Not Null                    
name    VARCHAR2    Not Null                    
description VARCHAR2                        
parent_id   NUMBER  Foreign Key references PRODUCT(id)                  

คำสั่งซื้อ - เพื่อเก็บคำสั่งซื้อผลิตภัณฑ์

id  NUMBER  "Primary Key Not Null"                  
prod_id     NUMBER  "Foreign Key references PRODUCT(id) Not Null"                   
order_type  VARCHAR2    "Not Null Default 'Default'"
order_qty   NUMBER  Not Null
order_date  NUMBER  Foreign Key references DATE_INFO(date_key)
delivery_date   NUMBER  "Foreign Key references DATE_INFO(date_key)
Check delivery_date >= order_date"

การคาดการณ์ - เพื่อจัดเก็บค่าพยากรณ์สำหรับผลิตภัณฑ์ (มูลค่าการจัดเก็บสำหรับระดับที่สูงขึ้นมูลค่าการจัดเก็บสำหรับระดับที่ต่ำกว่าหลังจากการแยกย่อยจากผู้ปกครอง)

id  NUMBER  "Primary Key Not Null"
product_id  NUMBER  "Foreign Key references PRODUCT(id) Not Null"
forecast_value  NUMBER  Not Null
week    NUMBER  "Foreign Key references DATE_INFO(date_key) Not Null"                   

DISAGGREGATION_RULES - เพื่อเก็บวิธีการที่ใช้สำหรับการแยกค่าจากระดับที่สูงขึ้นไปถึงระดับที่ต่ำกว่าและจำนวนเปอร์เซ็นต์ที่กระจายไปยังระดับที่ต่ำกว่า

id  NUMBER  "Primary Key Not Null"
parent_product_id   NUMBER  "Foreign Key id references PRODUCT(id) Not Null"
child_product_id    NUMBER  "Foreign Key id references PRODUCT(id) Not Null"
method  VARCHAR2    Not Null                    
from_week   NUMBER  "Foreign Key references DATE_INFO(date_key) Not Null"
to_week NUMBER  "Foreign Key references DATE_INFO(date_key) Not Null Check end_week >= start_week"
percent_distribution    NUMBER  Not Null                    

DATE_INFO - ส่วนข้อมูลวันที่มีข้อมูลเกี่ยวกับวันที่เริ่มต้น (ต้องเป็นวันเสาร์) และวันที่สิ้นสุดที่ตรงกับสัปดาห์ที่วันใดวันหนึ่งตก

date_key    NUMBER  "Primary Key
Not Null"                   
full_date   DATE    Not Null                    
week_begin_date DATE    Not Null                    
week_end_date   DATE    Not Null

สำหรับหมายเลขถัง .. ฉันกำลังคำนวณวันที่เริ่มต้นสัปดาห์ (วันที่ในวันเสาร์ในกรณีของฉัน) ด้วยฟังก์ชั่นดังต่อไปนี้

CREATE OR REPLACE FUNCTION get_week_start_date(v_bucket_num IN NUMBER)
  RETURN DATE
IS
  week_start_date DATE;
BEGIN
  SELECT (TRUNC(SYSDATE+2, 'IW')-2) + ((v_bucket_num-1) * 7)
  INTO week_start_date FROM dual;
  RETURN week_start_date;
END;
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.