V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
Stoulla
V2EX  ›  问与答

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

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

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

    比如:
    第一次入库 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   ·   实用小工具   ·   1448 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 17:13 · PVG 01:13 · LAX 09:13 · JFK 12:13
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.