数据库设计(库存数据库)

4
我正在寻求设计一个库存数据库来跟踪零食吧。由于这将是单人/计算机访问并且需要轻松移动到另一个系统,因此我计划使用SQLite作为DB引擎。基本概念是跟踪从批发仓库(如Sams Club)购买的库存,然后跟踪库存。

我试图克服的主要障碍是如何在产品数据库中跟踪批量与单个项目。例如,如果购买了一个批量项目,比如24罐可乐,我如何在产品数据库中维护批量项目以及其中包含24个单个项目。如果所有批量项目只包含1个项目的多个副本,解决方案将相当容易,但对于包含5种不同单个项目的芯片盒子等混合包装,每个单独的项目都有独立的UPC,解决方案变得更加困难。

到目前为止,我已经提出了多次扫描方法,以获取所有信息的DB。

Product_Table
SKU: INT
Name: TEXT
Brand: TEXT
PurchasePrice: REAL
UPC: BIGINT
DESC: TEXT
BULK: BOOLEAN
BulkList: TEXT // comma separated list of SKUs for each individual item
BulkQty: TEXT // comma separated list corresponding to each SKU above representing the quantity

Transaction_Table
SKU: INT
Qty: INT
// Other stuff but that is the essential

当我向库存添加大批量物品(正数交易)时,它应该添加所有单个物品,因为我想不到任何时候会有库存以出售大批量物品。但是,我希望将大批量物品保留在数据库中,以便于接收和添加到库存中。
2个回答

3
一种方法是创建一个1:N映射,将批量对象与其内容相关联:
create table bulk_item (
  bulk_product_id integer not null,
  item_product_id integer not null,
  qty integer not null,
  primary key(bulk_product_id, item_product_id),
  foreign key(bulk_product_id) references product(sku),
  foreign key(item_product_id) references product(sku)
);

一个用逗号分隔的列表当然可行(但它可能会使某些查询变得更加困难,例如查找包含此SKU的所有大批量对象等...)。

谢谢,我一直在努力创建一个仅包含大宗商品的单独表格。然而,有时可能会有不同的大宗商品包含共同的个别商品。例如,可能会有几种薯片混合包,所有三种包装都有玉米片。你的解决方案是我的第一选择,直到我意识到个别商品可以与多个大宗包装相关联。 - Neal

2
我既同意又不同意jspcal的观点。我赞同"bulk_item"表,但我不认为使用逗号分隔列表是“好的”。我怀疑他们只是客气,并不支持不符合第一范式的设计。
jspcal建议的设计通常被称为“材料清单”,这是处理复合产品问题的唯一明智的方法。
为了有效地使用此方法与您的交易表,您应该在SKU和数量之外包括交易类型代码。您的任何给定SKU的库存可能增加或减少有不同的原因。最常见的是收到新库存和客户购买库存。然而,还有其他事情需要考虑,比如手动库存调整,以考虑文书错误和缩水。还有库存转换,比如当您决定将多种包装分解成单个产品进行销售时。不要认为您可以依靠数量是正数还是负数来获得足够的信息,以便能够理解您的库存水平以及它们如何(以及为什么)发生变化。

1
jspcal建议使用N:M。bulk_item表是一个交叉表(多对多),其中父项和子项都是产品。您可能会将Doritos Blazin' Jalapeno作为派对混合包、Sam's大容量包、万圣节包和单独的零食包的一部分。您仍然只需要一个子表。 - Joel Brown
1
@DmitriBodiu 这是仓储、分销和零售业常见的情况。库存移动不仅仅是销售,还有退货和拆包装等情况,就像你所描述的那样。当你将一个SKU拆分成其他SKU时,通常不会是一对一的关系。你的物料清单将告诉你另一个SKU中有多少个SKU(例如2罐可乐在2罐装可乐中),因此你将知道要针对每个SKU进行多少借方和贷方。你需要在库存移动头部添加一个“type_code”来描述它是销售、退货还是拆包装。 - Joel Brown
1
@DmitriBodiu - 是的,完全就是这样。从实际、物理层面考虑一下。如果你拆开一箱罐头(打开盒子或剪掉塑料包装),那么你就没有了那个包装。相反,你有了一堆散装罐头。就像你“卖掉”了一个包装,为你的库存“购买”了24个单独的罐头——当然,你是在自己的库存中“购买”和“销售”的。 - Joel Brown
1
@DmitriBodiu 在分配 SKU 时,不要过度思考。将 SKU 绑定到您可以实际销售的单位上。不要为“55个袋子中的53个组成的托盘”设置 SKU - 这是不合理的。如果您可以销售整个托盘,则考虑设置一个完整托盘和一个单个袋子的 SKU。或者,您可以忽略55个袋子组成一个托盘的事实,只为1个袋子设置一个 SKU。设置 SKU 的原因是为了定价和销售,而不是为了库存跟踪。 - Joel Brown
1
@DmitriBodiu 库存移动的每个部分的借方和贷方应该相等,但是如果你把一个托盘拆成单个袋子,那就是两个(相关的)库存移动。把一个托盘拆成袋子就像卖掉一个托盘并购买55个袋子。托盘的库存在存储中减少1,在内部转移部门增加1。这相当于客户销售账户,数字永远不会回落。然后,内部转移部门获得了55个袋子的库存(这就像供应商交货),然后移动到存储中。每一半都平衡。 - Joel Brown
显示剩余16条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接