編集:[詳細]次の場合の基本的なスキーマ設計を考え出す必要があるトレーニング演習として、単純なデータベース設計タスクを行っています。
製品の親子階層があります (原材料 > 進行中の作業 > 最終製品)。
注文は各レベルで行われます。
注文数は、次の 6 か月間、毎週のバケットで表示できます。
商品レベルごとの需要予測が可能です。
需要予測は、次の 6 か月間、毎週のバケットに対して行われます。
通常、階層の上位レベル (原材料または進行中の作業) で行われます。
下位レベル (最終製品) に分解する必要があります。
需要予測を上位レベルから下位レベルに分解するには、次の 2 つの方法があります。
ユーザーは、最終製品の割合分布を指定します。たとえば、Work In Progress の予測が 1000 で、バケット 10 の最終製品 1 に 40%、最終製品 2 に 60% が必要だとユーザーが言うと、今から 10 週目 (日曜日から土曜日) の予測値最終製品 1 の場合は 400、最終製品 2 の場合は 600 になります。
ユーザーは、バケット 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
そのような要件の基本的な理想的なスキーマは何でしょうか?
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 11g を使用します)