按照你的描述,仓库与仓位的关系必须单独定义表格:create table T (仓库 id,仓位 id,primary key(仓库,仓位))否则,如果在你说的那个表中有两条记录:仓库    仓位    其它
---------------------------
  1       3     ....
  2       3     ....这时候信息系统就变成灾难了。

解决方案 »

  1.   

    上面有点笔误。create table 仓位所属的仓库 (仓库id,仓位id primary key)否则,当更新仓位所属的仓库时,可能没有更新所有的行,造成歧义。
      

  2.   

    假设仓库表A(仓库id,仓库name,仓库addr),仓位表B(仓库id,仓位id,仓位position),库存表C(库存id,仓库id,仓位id,库存amount);
    而另外一种设计把库存表作修改:库存表C(库存id,仓位id,库存amount),去掉了仓库id(从而没有冗余)。那么哪一种设计更好呢?假设现在我要分仓库汇总库存数(amount),如果采用后面一种设计,可能查询如下:
    SELECT Sum(goods.amount) , store.storeid FROM (select store.storeid,goods.amount from goods inner join ([store] inner join position on store.storeid=position.storeid) on goods.positionid=position.positionid) GROUP BY store.storeid;而如果采用前面一种设计,那么查询语句可能如下:
    SELECT Sum(goods2.amount), goods2.storeid FROM goods2 GROUP BY goods2.storeid;简洁而且更快,那么,大家认为采取哪一种设计比较好?如果是在你们自己的项目里面涉及到了这个问题?谢谢!
      

  3.   

    数据库设计可以先根据项目的需求画出实体-关系模型,你所说的仓库,仓位,库存都是实体,所以他们都得建一个表。然后再建他们之间的关系表,由于只有两个实体之间是多对多的关系时才有必要增加关系表,其余的关系只需要在一个表中加入另一个表中的关键字作为外键即可,规则如下:
     假设有   表A   和   表B
      
     1.A 与 B是一对一的  则将A的关键字加入B作为外键或者将B的关键字加入A中作为外键
     2.A 与 B是一对多的  则将A的关键字加入B中作为外键
     3.A 与 B是多对一的  则将B的关键字加入A中作为外键
     4.A 与 B是多对多的  则必须增加一个关系表,关键字是A的主键和B的主键
    所以
    由于仓库表和仓位表是一对多的关系,所以在仓位表中要加入仓库Id作为外键,而库存表如果只是指仓位的库存则,仓位与库存是一对一 或者 一对多的关系,这时把仓位的Id放入库存的表中是对的,而放入仓库Id到库存中是冗余的。因为仓库Id可以从仓位ID中得到
    所以我觉得是这样的:
    仓库表A(仓库id,仓库name,仓库addr),仓位表B(仓库id,仓位id,仓位position),
    库存表C(库存id,仓位id,库存amount),