需要予測の分解のための単純なスキーマの設計


9

次の場合の基本的なスキーマ設計を思い付かなければならないトレーニング演習として、単純なデータベース設計タスクを実行しています。

製品の親子階層があります(例:原材料>作業中>最終製品)。

  • 注文は各レベルで行われます。
  • 注文数は、次の6か月間、毎週のバケットで確認できます。
  • 製品レベルごとに需要予測を行うことができます。
  • 次の6か月以内の任意の週の需要予測を今日行うことができます。
  • 需要予測は、次の6か月間の毎週のバケットに対して行われます。

需要予測は通常、階層の上位レベル(原材料または仕掛品レベル)で行われます。下位レベル(最終製品)に分解する必要があります。

需要予測を上位レベルから下位レベルに分解する方法は2つあります。

  1. ユーザーは最終製品の割合分布を指定します。たとえば、作業中の予測は1000だとします。ユーザーは、バケット10の最終製品1に40%、最終製品2に60%が欲しいと言っています。次に、今から10週目(日曜日から土曜日)の予測値最終製品1の場合は400、最終製品2の場合は600になります。
  2. ユーザーは、バケット5の最終製品に対する注文に従って分解するだけで、バケット5の最終製品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

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.