Merancang Skema Sederhana untuk Disagregasi Permintaan Prakiraan

9

Saya melakukan tugas desain database sederhana sebagai latihan pelatihan di mana saya harus datang dengan desain skema dasar untuk kasus berikut:

Saya memiliki hierarki produk induk-anak (misalnya, Bahan Baku> Pekerjaan sedang Berlangsung> Produk Akhir).

  • Pesanan ditempatkan di setiap level.
  • Jumlah pesanan dapat dilihat dalam ember mingguan selama 6 bulan ke depan.
  • Perkiraan permintaan dapat dilakukan untuk setiap tingkat produk.
  • Perkiraan permintaan untuk setiap minggu dalam 6 bulan ke depan dapat dilakukan hari ini.
  • Prakiraan permintaan dilakukan untuk ember mingguan, selama 6 bulan ke depan.

Demand Forecast biasanya dilakukan di tingkat yang lebih tinggi dalam hierarki (Bahan Baku atau Pekerjaan dalam tingkat Kemajuan) Itu harus dipilah ke tingkat yang lebih rendah (Produk Akhir).

Ada 2 cara di mana perkiraan permintaan dapat dipilah dari tingkat yang lebih tinggi ke tingkat yang lebih rendah:

  1. Pengguna menentukan distribusi persentase untuk produk akhir. Katakanlah, ada perkiraan 1000 untuk Work In Progress .. dan pengguna berkata saya ingin 40% untuk Produk Akhir 1 dan 60% untuk Produk Akhir 2 di ember 10 .. Kemudian untuk minggu ke 10 (Minggu hingga Sabtu) dari sekarang, nilai perkiraan untuk Produk Akhir 1 akan menjadi 400 dan, untuk Produk Akhir 2 akan menjadi 600.
  2. Kata pengguna, pisahkan menurut pesanan yang ditempatkan terhadap produk akhir dalam Bucket 5, dan pesanan dalam bucket 5 untuk Produk Akhir 1 dan 2 masing-masing adalah 200 dan 800, maka nilai perkiraan untuk EP1 adalah ((200/1000) * 100)% dan untuk EP2 akan menjadi ((800/1000) * 100)% dari perkiraan untuk 'Work in Progress'.

Prakiraan akan dapat dilihat dalam ember mingguan selama 6 bulan ke depan dan format yang ideal adalah:

product name | bucket number | week start date | week end date | forecast value | created_on

Tabel PRODUCT_HIERARCHY dapat terlihat seperti ini:

id  |   name                |   parent_id
__________________________________________
1   |   raw material        |   (null)
2   |   work in progress    |   1
3   |   end product 1       |   2
4   |   end product 2       |   2

Tabel ORDERS mungkin terlihat seperti ini:

id | prod_id | order_date | delivery_date | delivered_date

dimana,

prod_idadalah kunci asing yang merujuk idpada tabel PRODUCT_HIERARCHY,

Bagaimana cara menyimpan ramalan? Apa yang akan menjadi skema dasar yang baik untuk persyaratan seperti itu?


Ide saya untuk memilih pesanan untuk 26 ember mingguan adalah:

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);

Tapi ini akan memberikan ember mingguan mulai dari hari ini terlepas dari hari itu. Bagaimana saya bisa mengubahnya menjadi Minggu hingga Sabtu minggu di Oracle?

Tolong bantu merancang struktur database ini.

(akan menggunakan Oracle 11g)

Abhinav Sood
sumber
1
Sepertinya Anda sedang membangun gudang data. pesanan akan menjadi tabel fakta. produk dan tanggal tabel dimensi. Anda mungkin ingin menggunakan tabel fakta akumulasi, karena Anda melihat proses yang memiliki beberapa langkah.
Neil McGuigan

Jawaban:

1

Oke, jadi inilah model data yang saya buat.

PRODUCT - untuk menyimpan informasi produk dan mempertahankan hierarki orang tua-anak

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)                  

PESANAN - untuk menyimpan pesanan untuk produk

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"

PERKIRAAN - untuk menyimpan nilai perkiraan produk (nilai toko untuk tingkat yang lebih tinggi, nilai toko untuk tingkat yang lebih rendah setelah pemisahan dari induk)

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 - untuk menyimpan metode mana yang digunakan untuk memisahkan nilai dari level yang lebih tinggi ke level yang lebih rendah dan berapa banyak persentase yang didistribusikan ke level yang lebih rendah

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 - dimensi tanggal, memiliki informasi tentang tanggal mulai (harus Sabtu) dan tanggal akhir yang sesuai dengan minggu saat tanggal tertentu jatuh

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

Adapun nomor ember .. Saya menghitung tanggal mulai minggu (tanggal pada hari Sabtu, dalam kasus saya) dengan fungsi berikut

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;
Abhinav Sood
sumber