Thiết kế lược đồ đơn giản để phân chia dự báo nhu cầu


9

Tôi đang thực hiện một nhiệm vụ thiết kế cơ sở dữ liệu đơn giản như một bài tập huấn luyện mà tôi phải đưa ra một thiết kế lược đồ cơ bản cho trường hợp sau:

Tôi có hệ thống phân cấp sản phẩm giữa cha và con (ví dụ: Nguyên liệu thô> Công việc đang tiến hành> Sản phẩm cuối).

  • Đơn đặt hàng được đặt ở mỗi cấp.
  • Số lượng đơn đặt hàng sẽ có thể xem được trong các thùng hàng tuần trong 6 tháng tới.
  • Dự báo nhu cầu có thể được thực hiện cho từng cấp độ sản phẩm.
  • Dự báo nhu cầu cho bất kỳ tuần nào trong vòng 6 tháng tới có thể được thực hiện ngày hôm nay.
  • Dự báo nhu cầu được thực hiện cho các thùng hàng tuần, trong 6 tháng tới.

Dự báo nhu cầu thường được thực hiện ở cấp cao hơn trong phân cấp (Nguyên liệu thô hoặc Công việc ở cấp tiến độ) Nó phải được phân chia thành cấp thấp hơn (Sản phẩm cuối).

Có 2 cách để dự báo nhu cầu có thể được phân tách từ cấp cao hơn xuống cấp thấp hơn:

  1. Người dùng chỉ định phân phối tỷ lệ phần trăm cho sản phẩm cuối cùng. Giả sử, có dự báo 1000 cho Công việc đang tiến hành .. và người dùng nói rằng tôi muốn 40% cho Sản phẩm cuối 1 và 60% cho Sản phẩm cuối 2 trong nhóm 10 .. Sau đó, từ tuần thứ 10 (Chủ nhật đến Thứ bảy) từ bây giờ, giá trị dự báo cho Sản phẩm cuối 1 sẽ là 400 và đối với Sản phẩm cuối 2 sẽ là 600.
  2. Người dùng cho biết, chỉ phân chia theo đơn đặt hàng so với sản phẩm cuối trong Nhóm 5 và đơn hàng trong nhóm 5 cho Sản phẩm cuối 1 và 2 lần lượt là 200 và 800, sau đó giá trị dự báo cho EP1 sẽ là ((200/1000) * 100)% và đối với EP2 sẽ là ((800/1000) * 100)% dự báo cho 'Công việc đang tiến triển'.

Dự báo sẽ có thể xem được trong các thùng hàng tuần trong 6 tháng tới và định dạng lý tưởng phải là:

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

Bảng PRODUCT_HIERARCHY có thể trông như thế này:

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

Bảng ORDERS có thể trông như thế này:

id | prod_id | order_date | delivery_date | delivered_date

Ở đâu,

prod_idlà khóa ngoại tham chiếu idcủa bảng PRODUCT_HIERARCHY,

Làm thế nào để lưu trữ dự báo? Điều gì sẽ là một lược đồ cơ bản tốt cho một yêu cầu như vậy?


Ý tưởng của tôi để chọn đơn hàng cho 26 thùng hàng tuần là:

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

Nhưng điều này sẽ cung cấp cho các thùng hàng tuần bắt đầu từ hôm nay bất kể ngày nào. Làm cách nào tôi có thể chuyển đổi chúng sang Chủ nhật sang tuần thứ bảy trong Oracle?

Xin hãy giúp thiết kế cấu trúc cơ sở dữ liệu này.

(sẽ sử dụng Oracle 11g)


1
Nghe có vẻ như bạn đang xây dựng một kho dữ liệu. thứ tự sẽ là bảng thực tế. sản phẩm và ngày tháng bảng kích thước. Bạn có thể muốn sử dụng bảng thực tế tích lũy, vì bạn đang xem xét một quy trình có một vài bước.
Neil McGuigan

Câu trả lời:


1

Được rồi, đây là mô hình dữ liệu tôi nghĩ ra.

SẢN PHẨM - để lưu trữ thông tin sản phẩm và duy trì phân cấp cha-con

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)                  

ĐƠN HÀNG - để lưu trữ đơn đặt hàng cho sản phẩm

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"

DỰ BÁO - để lưu trữ giá trị dự báo cho các sản phẩm (giá trị lưu trữ cho các cấp cao hơn, lưu trữ giá trị cho các cấp thấp hơn sau khi phân chia từ cha mẹ)

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 - để lưu trữ phương thức nào đã được sử dụng để phân tách một giá trị từ cấp cao hơn xuống cấp thấp hơn và bao nhiêu phần trăm được phân phối cho cấp thấp hơn

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 - thứ nguyên ngày, có thông tin về ngày bắt đầu (phải là thứ bảy) và ngày kết thúc tương ứng với tuần mà ngày cụ thể rơi vào

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

Đối với số xô .. Tôi đang tính ngày bắt đầu tuần (ngày vào thứ bảy, trong trường hợp của tôi) với chức năng sau

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;
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.