2013-05-07 53 views
0

假设多个构成元素ID的Oracle表

库存表包含:
STOCK_ID
STOCK_QTY

组件表中包含:
COMPONENT_ID
COMPONENT_QTY
STOCK_ID(FK)

三明治表包含:
SANDWICH_ID
SANDWICH_PRICE
COMPONENT_ID(FK)

我有三个三明治,腊肉,香肠和熏肉和香肠。 STOCK_QTY包含整个商店的库存数量。 COMPONENT_ID包含每个三明治所用组件的数量。

现在,我遇到的问题是,我需要每个三明治多个组件(使一个完整的三明治,即面包,黄油,香肠),这反过来将从整体库存量(面包200,黄油200,香肠300)除以组分数量栏中指定的值(面包2,黄油1香肠2)。我无法弄清楚如何设计/实现这个。为什么/我该如何将多个COMPONENT_ID分配给SANDWICH_ID,或者我是否完全错误。我一直在思考这个问题两天,并没有进一步的了解。

TABLES

MSD_COMPONENT:

COMPONENT_ID  VARCHAR2(8)  No  -  1 
COMPONENT_TYPE  VARCHAR2(8)  Yes  -  - 
COMPONENT_QTY  NUMBER   Yes  -  - 
COMPONENT_DECSR  VARCHAR2(25) Yes  -  - 
STOCK_ID   VARCHAR2(8)  Yes  -  - 


COMPONENT_ID COMPONENT_TYPE COMPONENT_QTY COMPONENT_DECSR  STOCK_ID 
    CID0001  BREAD   2   WHITE BREAD SLICES SID0001 
    CID0002  BREAD   2   BROWN BREAD SLICES SID0002 
    CID0003  BREAD   1   WHITE BREAD BAP  SID0003 
    CID0004  BREAD   1   BROWN BREAD BAP  SID0004 
    CID0005  BREAD   2   WHOLEMEAL SLICES  SID0005 
    CID0015  MEAT   200   BACON RASHERS  SID0006 
    CID0006  BREAD   1   WHOLEMEAL BAPS  SID0007 
    CID0007  VEG   100   TOMATOES    SID0008 
    CID0008  VEG    15   ONIONS    SID0009 
    CID0009  VEG    40   PEPPERS    SID0010 
    CID0010  VEG    25   CARROTS    SID0011 
    CID0011  MEAT   50   BEEF     SID0012 
    CID0012  MEAT   100   CHICKEN BREAST  SID0013 
    CID0013  MEAT   50   HAM     SID0014 
    CID0014  MEAT   100   PORK SAUSAGE   SID0015 

MSD_SANDWICH:

SANDWICH_ID   VARCHAR2(8)  No  -  1 
SANDWHICH_TYPE  VARCHAR2(8)  Yes  -  - 
SANDWICH_DESCRIP VARCHAR2(20) Yes  -  - 
SANDWICH_PRICE  VARCHAR2(8)  Yes  -  - 
COMPONENT_ID  VARCHAR2(8)  Yes  -  - 

MSD_STOCK:

STOCK_ID VARCHAR2(8)  No  -  1 
STOCK_TYPE VARCHAR2(15) Yes  -  - 
SHOP_ID  VARCHAR2(6)  Yes  -  - 
STOCK_QTY NUMBER   No  -  - 

EDIT:格式化

+0

虽然这听起来很美味,你能提供包含数据这些表的一些论证,要对它们进行操作什么,所以使问题更加清楚了吗? – Passerby 2013-05-07 09:21:00

+0

对不起!编辑以包含表格。正如你所看到的,我只能在三明治表中有一个组件ID,但三明治将包含多个组件。我很困惑! – oldmanpete 2013-05-07 09:43:51

回答

0

花了一些时间阅读你的问题......

我怎么分配多个COMPONENT_IDs到SANDWICH_ID

这看起来像一个典型的一对多的关系。

MSD_RECIPE:

SANDWICH_ID (FK) COMPONENT_ID (FK) 
    SID0001   CID0001 
    SID0001   CID0015 
    SID0001   CID0007 /* white sandwich made with bacon and tomato */ 
    SID0002   CID0002 
    SID0002   CID0013 
    SID0002   CID0008 /* brown sandwich made with ham and onion */ 

现在你有一个关系表食谱

,你不必这可以通过增加第三个“关系”表中一般都做(在技术上我认为这是逻辑不正确),您可以将数量移动到RECIPE以使事情更加灵活:

MSD_INGREDIENTS(替换MSD_COMPONENT):

INGREDIENT_ID INGREDIENT_TYPE INGREDIENT_DECSR  STOCK_ID 
    CID0001  BREAD   WHITE BREAD SLICES SID0001 
    CID0002  BREAD   BROWN BREAD SLICES SID0002 
    CID0005  BREAD   WHOLEMEAL SLICES  SID0005 
    CID0015  MEAT   BACON RASHERS  SID0006 
    CID0006  BREAD   WHOLEMEAL BAPS  SID0007 
    CID0007  VEG   TOMATOES    SID0008 
    CID0008  VEG   ONIONS    SID0009 
    CID0010  VEG   CARROTS    SID0011 
    CID0013  MEAT   HAM     SID0014 

MSD_RECIPE:

SANDWICH_ID (FK) INGREDIENT_ID (FK) QUANTITY 
    SID0001   CID0001    2 
    SID0001   CID0015    200 
    SID0001   CID0007    100 /* old white sandwich */ 
    SID0003   CID0002    2 /* two brown bread */ 
    SID0003   CID0005    1 /* one wholeweat bread */ 
    SID0003   CID0013    100 /* one ham */ 
    SID0003   CID0015    100 /* one bacon */ 
    SID0003   CID0008    30 /* new 2-level sandwich! */ 
+0

我不得不读了几次才使它沉入水中,但这已经完成了。非常感谢Passerby先生:) – oldmanpete 2013-05-07 22:56:29