Diseño de un esquema simple para la desagregación del pronóstico de demanda


9

Estoy haciendo una tarea de diseño de base de datos simple como un ejercicio de capacitación en el que tengo que elaborar un diseño de esquema básico para el siguiente caso:

Tengo una jerarquía de productos padre-hijo (por ejemplo, Materia prima> Trabajo en curso> Producto final).

  • Los pedidos se realizan en cada nivel.
  • El número de pedidos se podrá ver en cubos semanales durante los próximos 6 meses.
  • El pronóstico de demanda se puede hacer para cada nivel de producto.
  • El pronóstico de demanda para cualquier semana dentro de los próximos 6 meses se puede hacer hoy.
  • El pronóstico de la demanda se realiza para cubos semanales, durante los próximos 6 meses.

El pronóstico de demanda generalmente se realiza en el nivel superior de la jerarquía (materia prima o nivel de trabajo en curso). Debe desglosarse a un nivel inferior (producto final).

Hay 2 formas en que el pronóstico de la demanda puede desglosarse de un nivel superior a un nivel inferior:

  1. El usuario especifica la distribución porcentual para el producto final. Digamos que hay un pronóstico de 1000 para Work In Progress ... y el usuario dice que quiero un 40% para el Producto final 1 y un 60% para el Producto final 2 en el paquete 10 ... Luego, para la décima semana (de domingo a sábado) a partir de ahora, valor de pronóstico para el Producto final 1 sería 400 y para el Producto final 2 sería 600.
  2. El usuario dice que solo desagregue de acuerdo con los pedidos realizados para los productos finales en el Paquete 5, y los pedidos en el paquete 5 para el Producto final 1 y 2 son 200 y 800 respectivamente, luego el valor pronosticado para EP1 sería ((200/1000) * 100)% y para EP2 sería ((800/1000) * 100)% del pronóstico para 'Trabajo en progreso'.

El pronóstico se podrá ver en intervalos semanales durante los próximos 6 meses y el formato ideal debería ser:

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

La tabla PRODUCT_HIERARCHY podría verse así:

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

La tabla PEDIDOS podría verse así:

id | prod_id | order_date | delivery_date | delivered_date

dónde,

prod_ides una clave externa que hace referencia a la idtabla PRODUCT_HIERARCHY,

¿Cómo almacenar el pronóstico? ¿Cuál sería un buen esquema básico para tal requisito?


Mi idea para seleccionar pedidos para 26 cubos semanales es:

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

Pero esto dará cubetas semanales a partir de hoy, independientemente del día. ¿Cómo puedo convertirlos de domingo a sábado en Oracle?

Por favor, ayuda a diseñar esta estructura de base de datos.

(usará Oracle 11g)


1
Parece que estás construyendo un almacén de datos. orden sería la tabla de hechos. producto y fecha las tablas de dimensiones. Es posible que desee utilizar una tabla de hechos acumulados, ya que está viendo un proceso que tiene varios pasos.
Neil McGuigan

Respuestas:


1

Bien, aquí está el modelo de datos que se me ocurrió.

PRODUCTO: para almacenar información del producto y mantener la jerarquía padre-hijo

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)                  

PEDIDOS - para almacenar pedidos de productos

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"

PRONÓSTICO - para almacenar el valor de pronóstico para productos (valor de tienda para niveles más altos, valor de tienda para niveles más bajos después de la desagregación de un padre)

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: para almacenar qué método se utilizó para desagregar un valor de un nivel superior a un nivel inferior y cuánto porcentaje se distribuyó a un nivel inferior

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: dimensión de fecha, tiene información sobre la fecha de inicio (debe ser el sábado) y la fecha de finalización correspondiente a la semana en la que cae una fecha en particular

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

En cuanto al número de cubo ... Estoy calculando la fecha de inicio de la semana (fecha el sábado, en mi caso) con la siguiente función

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;
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.