Oracle
 sql >> Base de données >  >> RDS >> Oracle

Conception d'un schéma simple pour la désagrégation de la prévision de la demande

Votre dernier commentaire correspond exactement à ce que je voulais dire. Cool de voir que vous l'avez compris !

Depuis que j'avais commencé à le faire, j'ai fini un exemple de code. La différence avec ce que vous disiez est de séparer ce qui va changer de ce qui ne va pas (raw_material CONTRE raw_material_hist ) en utilisant uniquement la date de la semaine, qui est lundi , et diverses contraintes de vérification.

CREATE TABLE raw_material 
  ( 
     material_id     NUMBER PRIMARY KEY, 
     material_blabla VARCHAR2(20) 
  ); 

CREATE TABLE wip 
  ( 
     wip_id     NUMBER PRIMARY KEY, 
     parent_raw NUMBER REFERENCES raw_material(material_id), 
     wip_desc   VARCHAR2(20) 
  ); 

CREATE TABLE end_product 
  ( 
     end_product_id NUMBER PRIMARY KEY, 
     parent_wip     NUMBER REFERENCES wip(wip_id), 
     description    VARCHAR2(20) 
  ); 

CREATE TABLE rm_histo 
  ( 
     material_id NUMBER REFERENCES raw_material(material_id), 
     week_start  DATE CHECK (To_char(week_start, 'D')=1), 
     forecast    NUMBER(8) CHECK (forecast >0), 
     CONSTRAINT pk_rm_histo PRIMARY KEY (material_id, week_start) 
  ); 

CREATE TABLE wip_histo 
  ( 
     wip_id            NUMBER REFERENCES wip(wip_id), 
     week_start        DATE CHECK(To_char(week_start, 'D')=1), 
     wip_user_forecast NUMBER(8) CHECK (wip_user_forecast>0), 
     CONSTRAINT pk_wip_histo PRIMARY KEY (wip_id, week_start) 
  ); 

CREATE TABLE end_prod_histo 
  ( 
     end_product_id         NUMBER REFERENCES end_product(end_product_id), 
     week_start             DATE CHECK(To_char(week_start, 'D')=1), 
     end_prod_user_forecast NUMBER(8) CHECK (end_prod_user_forecast >0) 
  ); 

Et à la fin, en effet vous utilisez une vue pour voir les choses prévues, ou matérialisée si vous avez des tonnes de données. En utilisant une vue, vous ne dupliquez pas les données, il est donc plus sûr et plus facile de modifier/mettre à jour.

Pour vos cas d'utilisation 1 ou 2, cela ne traite pas du schéma de base de données. En fin de compte, il ne s'agira que de mettre à jour une valeur pour la prévision, la logique des cas d'utilisation 1 ou 2 pourrait aller dans une procédure PL/SQL ou tout ce que vous utilisez pour l'interface.

Edit :De plus, dans votre dernier commentaire, vous mentionniez que les prévisions étaient définies manuellement par rapport à celles calculées. J'ai donc ajouté une telle colonne, mais les crédits vous reviennent

Modifier bis :en ce qui concerne le numéro de compartiment, utilisez simplement un masque approprié pour la date, comme IW ou WW . Ces deux changements qui est la première semaine de l'année.