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:
- 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.
- 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_id
es una clave externa que hace referencia a la id
tabla 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)
fuente
Respuestas:
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
PEDIDOS - para almacenar pedidos de productos
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)
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
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
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
fuente