Ich mache eine einfache Datenbankentwurfsaufgabe als Schulungsübung, bei der ich ein grundlegendes Schemadesign für den folgenden Fall erstellen muss:
Ich habe eine Eltern-Kind-Hierarchie von Produkten (Beispiel: Rohmaterial> In Bearbeitung> Endprodukt).
- Bestellungen werden auf jeder Ebene aufgegeben.
- Die Anzahl der Bestellungen wird für die nächsten 6 Monate in wöchentlichen Eimern angezeigt.
- Bedarfsprognosen können für jede Produktebene erstellt werden.
- Die Nachfrageprognose für jede Woche innerhalb der nächsten 6 Monate kann heute erstellt werden.
- Die Nachfrageprognose wird für wöchentliche Eimer für die nächsten 6 Monate erstellt.
Die Bedarfsprognose wird normalerweise auf der höheren Hierarchieebene (Rohmaterial- oder Work in Progress-Ebene) erstellt. Sie muss auf eine niedrigere Ebene (Endprodukt) disaggregiert werden.
Es gibt zwei Möglichkeiten, wie die Nachfrageprognose von einer höheren auf eine niedrigere Ebene aufgeschlüsselt werden kann:
- Der Benutzer gibt die prozentuale Verteilung für das Endprodukt an. Angenommen, es gibt eine Prognose von 1000 für Work In Progress. Der Benutzer sagt, ich möchte 40% für Endprodukt 1 und 60% für Endprodukt 2 in Eimer 10. Dann für die 10. Woche (Sonntag bis Samstag) ab sofort den Prognosewert für Endprodukt 1 wäre 400 und für Endprodukt 2 wäre 600.
- Der Benutzer sagt, dass er nur nach Bestellungen für Endprodukte in Bucket 5 disaggregiert und die Bestellungen in Bucket 5 für Endprodukt 1 und 2 200 bzw. 800 betragen. Der prognostizierte Wert für EP1 wäre dann ((200/1000) * 100)% und für EP2 wäre ((800/1000) * 100)% der Prognose für "Work in Progress".
Die Prognose muss für die nächsten 6 Monate in wöchentlichen Eimern angezeigt werden. Das ideale Format sollte sein:
product name | bucket number | week start date | week end date | forecast value | created_on
Die Tabelle PRODUCT_HIERARCHY könnte folgendermaßen aussehen:
id | name | parent_id
__________________________________________
1 | raw material | (null)
2 | work in progress | 1
3 | end product 1 | 2
4 | end product 2 | 2
Die Tabelle ORDERS könnte folgendermaßen aussehen:
id | prod_id | order_date | delivery_date | delivered_date
wo,
prod_id
ist ein Fremdschlüssel, id
der auf die Tabelle PRODUCT_HIERARCHY verweist.
Wie speichere ich die Prognose? Was wäre ein gutes Grundschema für eine solche Anforderung?
Meine Idee, Bestellungen für 26 wöchentliche Eimer auszuwählen, ist:
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);
Dies gibt jedoch ab heute wöchentliche Eimer, unabhängig vom Tag. Wie kann ich sie in Oracle in Wochen von Sonntag bis Samstag konvertieren?
Bitte helfen Sie beim Entwerfen dieser Datenbankstruktur.
(wird Oracle 11g verwenden)
quelle
Antworten:
Okay, hier ist das Datenmodell, das ich mir ausgedacht habe.
PRODUKT - zum Speichern von Produktinformationen und zum Verwalten der Eltern-Kind-Hierarchie
BESTELLUNGEN - um Bestellungen für Produkte zu speichern
PROGNOSE - zum Speichern des Prognosewerts für Produkte (Speicherwert für höhere Ebenen, Speicherwert für niedrigere Ebenen nach Disaggregation von einem Elternteil)
DISAGGREGATION_RULES - um zu speichern, mit welcher Methode ein Wert von einer höheren auf eine niedrigere Ebene disaggregiert wurde und wie viel Prozent auf eine niedrigere Ebene verteilt wurden
DATE_INFO - Datumsdimension, enthält Informationen zum Startdatum (muss Samstag sein) und zum Enddatum, die der Woche entsprechen, in die ein bestimmtes Datum fällt
Was die Bucket-Nummer betrifft. Ich berechne das Wochenstartdatum (in meinem Fall das Datum am Samstag) mit der folgenden Funktion
quelle