Я виконую просте завдання з проектування бази даних як навчальну вправу, де мені потрібно придумати базову схему для наступного випадку:
У мене є ієрархія батьків-дітей (наприклад, сировина> незавершене виробництво> кінцевий продукт).
- Замовлення розміщуються на кожному рівні.
- Кількість замовлень має відображатися у відрядах за тиждень протягом наступних 6 місяців.
- Прогноз попиту можна зробити для кожного рівня продукту.
- Прогноз попиту на будь-який тиждень протягом наступних 6 місяців можна зробити сьогодні.
- Прогноз попиту робиться для тижневих відер, протягом наступних 6 місяців.
Прогноз попиту, як правило, робиться на більш високому рівні в ієрархії (сировина або робота в процесі прогресу). Її потрібно розділити на нижчий рівень (кінцевий продукт).
Є два способи, за допомогою яких прогноз попиту можна розділити з вищого на нижчий:
- Користувач визначає відсотковий розподіл для кінцевого продукту. Скажімо, є прогноз 1000 для роботи в прогресі. для кінцевого продукту 1 буде 400, а для кінцевого продукту 2 - 600.
- Користувач каже, що просто розділіть їх відповідно до замовлень, розміщених проти кінцевих продуктів у Відрі 5, а замовлення у відрі 5 для Кінцевого продукту 1 та 2 становлять відповідно 200 та 800, тоді прогнозне значення для EP1 складе ((200/1000) * 100)% а для EP2 було б ((800/1000) * 100)% від прогнозу "Робота в процесі".
Прогноз повинен бути видно у тижневих відрах протягом наступних 6 місяців, а ідеальний формат повинен бути:
product name | bucket number | week start date | week end date | forecast value | created_on
Таблиця 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?
Будь ласка, допоможіть розробити цю структуру бази даних.
(буде використовувати Oracle 11g)