数据库设计时如何处理一对多的关系? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Stoulla
V2EX    问与答

数据库设计时如何处理一对多的关系?

  •  
  •   Stoulla 2020-02-15 20:26:41 +08:00 2948 次点击
    这是一个创建于 2139 天前的主题,其中的信息可能已经有所发展或是发生改变。

    设计一个进销存的数据库。这样就会在入库时,同一商品会有不同供货商和供货时段,产生不同的入库价格。

    比如: 第一次入库 10 个 A 商品, 入库时单价为 10 元,对应供应商 1 号。 第二次入库 20 个 A 商品, 入库单价为 20 元, 对应供应商 2 号。 这样就会有 30 个 A 商品。 

    目前我就用的笨办法。 即只用一个 merchandise 表。 第一次和第二次入库作为两个条目。分别对应不同的供应商的批次。 但这样势必会造成在查商品库存时需要额外的查询。同样在出库时,也会有重复的条目。即会出现 A(1)商品和 A(2)商品。 虽然都是 A 商品。但是会出现重复。

    请问如何设计以回避这种情况呢?

    8 条回复    2020-02-16 03:40:14 +08:00
    Stoulla
        1
    Stoulla  
    OP
       2020-02-15 20:51:00 +08:00
    Emm,即使是将这个表拆成 3 个表。 即一个 merchandise 表;一个 price ; 另一个 merchan_price 表用于链接。 这样在出库的时候,就需要先查询库存,然后再进行出库,这样就要维护一个顺序,比如采用先进先出。以问题中的例子为例,假如出库 25 件 A 商品, 则需要修改 merchandise 表,删除其中第一个条目,再修改第二个条目。 这样感觉挺蠢的,有没有优美一些的实现方式呢?
    kxboy
        2
    kxboy  
       2020-02-15 20:56:41 +08:00 via Android
    不懂数据库设计,但是经历过好几次次进销存 ERP 的项目实施上线,在生产制造业待过好几年,也算是进销存深度用户了。感觉问这个问题好像是业务逻辑没搞明白。

    就个人在业务实操中遇到的情况,主要看你的商品需不需要启动批次管理吧?

    有些商品要遵循有效期管理,或者先进先出原则,或者严格区分批次,不同批次产品不得混用等等原因,这种在查库存的时候就是要体现不同批号 A1 A2,然后对不同批次产品汇总查询。这种产品入库和出库都要十分注意批次区分的,批次跟规格属性同样重要,多个条目库存是对的,货位管理也要区分批次,不是一个批次,在仓库管理中都不是同一个产品,如果混到一块反而不对了。


    如果是不需要批号管理的产品,那就更简单了,每个产品在库存里只有一条,是加到一起的。

    另外一般管理批次价格都是在采购单据里控制的,批次管理是在入库单据中控制的,入库甚至都不需要体现价格。同一供应商不同批次不同价格,不同供应商不同价格,这个不要太常见。

    说的不一定对,不知道有没有说到点上。
    imn1
        3
    imn1  
       2020-02-15 21:16:26 +08:00
    问题中所述,最主要是出库逻辑没定好
    例如到期先出,例如生鲜等有保质期的
    价低先出,例如保证盈利
    量少先出,例如尽快完成一个供应商订单,尾款结算,资金回笼
    ……
    反正这些逻辑,理应由业务决定

    另外不必删除啊,存量字段置零则可,定期批量移走存量为零的到历史数据库
    Stoulla
        4
    Stoulla  
    OP
       2020-02-15 21:16:46 +08:00
    @kxboy 感谢回复!非常有帮助。确实我只考虑了统计库存和出库时的方便,没考虑业务逻辑的正确性。

    但我还是有些好奇,是否有数据库的相关设计规范用于解决这一类问题呢?毕竟我自己想的解决方式实在是太过于丑陋了一些。
    Stoulla
        5
    Stoulla  
    OP
       2020-02-15 21:23:51 +08:00
    @imn1 有道理。我是觉得,我这样设计数据库,会导致修改的地方太多了一些,而且要先查总量再修改多个条目,主要是觉得实现太丑了,想请教请教下有没有什么有趣的设计方式。

    另外业务逻辑,可以采用最简单的先进先出,然后出库价格为入库价格*1.2 之类的简化版。 不过确实我这业务逻辑有点错到姥姥家的感觉- -
    lxk11153
        6
    lxk11153  
       2020-02-15 21:34:19 +08:00
    如下可否:
    1. 商品表 A 字段-name 字段-库存
    2. 供应商表 C 字段-name
    3. 出入库表 B 字段-数量(正负或者单独加字段区别出入库) 字段-单价 字段-商品 字段-供应商 /卖给谁
    kxboy
        7
    kxboy  
       2020-02-15 23:48:26 +08:00 via Android
    @Stoulla 我在实际业务中,启用批次管理的项目和不启用批次管理的项目都做过。

    关于价格和批次之间的关系,也是要根据实际业务来,这个应该也没有什么规范。

    我看了你下面的一些回复,我猜测你是应该比较纠结如何计算库存成本的问题吧?我简单说下我们原来的方案吧!

    如果是启用批次管理的产品,入库的时候,可以把采购的成本价格通过入库单和批次绑定,这样库存表里每个批次都有个固定的成本价,财务上比较清楚,无论采用什么出库原则,都是可以算的明明白白,这种对仓库实际业务操作比较麻烦,每次出入库都要注意批号。

    如果不需要启用批次管理的业务逻辑,一般仓库价格成本不会算的特别准确,财务上可能只会通过一个“参考价格”来估算库存成本,这个参考价格可能是通过历史采购价,或者最近采购价,平均采购价,先进先出原则加权平均计算成本价等多种方式来定,看老板需求了。这种情况库存表一般只管理库存数量不管理价格,价格通过采购订单表管理,或者单独出一个价格表然后去单独计算参考成本价格。这个定价原则,多是财务或老板来定。

    进销存很多时候,也是财务和业务部门较量的一个过程。有的公司重业务效率,实操怎么简便怎么来,有的公司重财务,财务数据一个数字都不能错。

    无论是哪种处理方式,最终财务上都有方法去处理的,关键是这个活派给谁干的事情。还是应该从业务上出发考虑多些。
    akira
        8
    akira  
       2020-02-16 03:40:14 +08:00
    入库是入库,库存是库存,出库是出库
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5205 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 33ms UTC 05:48 PVG 13:48 LAX 21:48 JFK 00:48
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86