Estou executando uma tarefa simples de design de banco de dados como um exercício de treinamento em que preciso criar um design de esquema básico para o seguinte caso:
Eu tenho uma hierarquia pai-filho de produtos (exemplo: Matéria-prima> Trabalho em andamento> Produto final).
- Os pedidos são feitos em cada nível.
- O número de pedidos deve ser visualizado em baldes semanais pelos próximos 6 meses.
- A previsão da demanda pode ser feita para cada nível do produto.
- A previsão de demanda para qualquer semana nos próximos 6 meses pode ser feita hoje.
- A previsão da demanda é feita para os intervalos semanais, para os próximos 6 meses.
A Previsão da demanda geralmente é feita no nível mais alto da hierarquia (nível de matéria-prima ou material em andamento). É necessário desagregar-se para um nível mais baixo (produto final).
Existem duas maneiras pelas quais a previsão de demanda pode ser desagregada de um nível mais alto para um nível mais baixo:
- O usuário especifica a distribuição percentual do produto final. Digamos, há uma previsão de 1000 para o trabalho em andamento. E o usuário diz que quero 40% para o produto final 1 e 60% para o produto final 2 no intervalo 10. Depois, para a 10ª semana (domingo a sábado), a partir de agora para o produto final 1 seria 400 e, para o produto final 2 seria 600.
- O usuário diz que apenas desagrega de acordo com os pedidos feitos nos produtos finais no balde 5 e os pedidos no balde 5 para o produto final 1 e 2 são 200 e 800 respectivamente, então o valor previsto para EP1 seria ((200/1000) * 100)% e para o EP2 seria ((800/1000) * 100)% da previsão para 'Trabalho em andamento'.
A previsão deve ser visualizada em intervalos semanais para os próximos 6 meses e o formato ideal deve ser:
product name | bucket number | week start date | week end date | forecast value | created_on
A tabela PRODUCT_HIERARCHY pode ficar assim:
id | name | parent_id
__________________________________________
1 | raw material | (null)
2 | work in progress | 1
3 | end product 1 | 2
4 | end product 2 | 2
A tabela ORDERS pode ficar assim:
id | prod_id | order_date | delivery_date | delivered_date
Onde,
prod_id
é uma chave estrangeira que faz referência id
à tabela PRODUCT_HIERARCHY,
Como armazenar previsão? Qual seria um bom esquema básico para esse requisito?
Minha ideia para selecionar pedidos para 26 baldes semanais é:
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);
Mas isso dará baldes semanais a partir de hoje, independentemente do dia. Como posso convertê-los para semanas de domingo a sábado no Oracle?
Por favor, ajude a projetar essa estrutura de banco de dados.
(usará o Oracle 11g)
fonte
Respostas:
Ok, então aqui está o modelo de dados que eu criei.
PRODUCT - para armazenar informações do produto e manter a hierarquia pai-filho
PEDIDOS - para armazenar pedidos de produtos
PREVISÃO - para armazenar o valor previsto dos produtos (armazenar valor para níveis mais altos, armazenar valor para níveis mais baixos após a desagregação de um pai)
DISAGGREGATION_RULES - para armazenar qual método foi usado para desagregar um valor de um nível mais alto para um nível mais baixo e quanto percentual foi distribuído para um nível mais baixo
DATE_INFO - dimensão da data, possui informações sobre a data de início (tem que ser sábado) e a data de término correspondente à semana em que uma determinada data cai
Quanto ao número do balde. Estou calculando a data de início da semana (data de sábado, no meu caso) com a seguinte função
fonte