수요 예측의 분류를위한 간단한 스키마 설계


9

나는 다음과 같은 경우에 대한 기본 스키마 디자인을 고안 해야하는 훈련 연습으로 간단한 데이터베이스 디자인 작업을 수행하고 있습니다.

제품의 부모-자식 계층이 있습니다 (예 : 원자재> 진행중인 작업> 최종 제품).

  • 각 레벨에서 주문이 이루어집니다.
  • 다음 6 개월 동안 매주 주문량을 볼 수 있습니다.
  • 각 제품 레벨에 대한 수요 예측을 수행 할 수 있습니다.
  • 향후 6 개월 이내에 모든 주에 대한 수요 예측을 오늘 수행 할 수 있습니다.
  • 수요 예측은 다음 6 개월 동안 매주 버킷에 대해 수행됩니다.

수요 예측은 일반적으로 높은 수준의 계층 (원자재 또는 진행중인 작업 레벨)에서 수행됩니다. 하위 레벨 (최종 제품)로 분리해야합니다.

수요 예측을 상위 레벨에서 하위 레벨로 분리 할 수있는 두 가지 방법이 있습니다.

  1. 사용자는 최종 제품의 배포 비율을 지정합니다. 예를 들어, Work In Progress.에 대한 예측 1000이 있고 사용자가 버킷 10의 최종 제품 1에 대해 40 %, 최종 제품 2에 대해 60 %를 원한다고 말합니다. 그런 다음 지금부터 10 주 (일요일부터 토요일까지), 예측 값 최종 제품 1의 경우 400이고 최종 제품 2의 경우 600입니다.
  2. 사용자는 버킷 5의 최종 제품에 대한 주문에 따라 분리하고 최종 제품 1 및 2의 버킷 5의 주문은 각각 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

ORDERS 테이블 다음과 같습니다.

id | prod_id | order_date | delivery_date | delivered_date

어디,

prod_ididPRODUCT_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 2013

답변:


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"

FORECAST-제품에 대한 예측 값을 저장합니다 (상위 레벨에서 더 높은 레벨에 대한 상점 값, 상위에서 분리 한 후 더 낮은 레벨에 대한 상점 값)

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.