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

Database 数据库设计(库存数据库),database,sqlite,database-design,Database,Sqlite,Database Design,我想设计一个跟踪快餐店的库存数据库。由于这将是一个人/计算机访问,并且需要很容易地移动到另一个系统,因此我计划使用SQLite作为DB引擎。基本概念是跟踪从批发仓库(如Sams Club)购买的库存,然后跟踪库存 我试图克服的主要障碍是如何跟踪产品数据库中的批量和单个项目。例如,如果购买了大宗商品,比如24包可口可乐,我如何在产品数据库中维护大宗商品,并且它包含24个单独的商品。如果所有散装物品只包含1个物品的多个,那么解决方案将相当简单,但在各种包装中,例如一盒芯片包含5个不同的单独物品,所有

我想设计一个跟踪快餐店的库存数据库。由于这将是一个人/计算机访问,并且需要很容易地移动到另一个系统,因此我计划使用SQLite作为DB引擎。基本概念是跟踪从批发仓库(如Sams Club)购买的库存,然后跟踪库存

我试图克服的主要障碍是如何跟踪产品数据库中的批量和单个项目。例如,如果购买了大宗商品,比如24包可口可乐,我如何在产品数据库中维护大宗商品,并且它包含24个单独的商品。如果所有散装物品只包含1个物品的多个,那么解决方案将相当简单,但在各种包装中,例如一盒芯片包含5个不同的单独物品,所有物品都带有单独的UPC,解决方案将变得更加困难

到目前为止,我已经提出了多次扫描的方法,在这种方法中,数据库将被扫描多次以获得所有信息

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

当我将一个大宗商品添加到库存中(一个正数量交易)时,它应该添加所有的单个商品,因为我想不出任何时候我会保留库存来出售大宗商品。但是,我希望将批量项目保留在数据库中,以帮助接收并将其添加到库存中。

一种方法是在批量对象及其内容之间创建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的所有批量对象等等)。

我必须同意和不同意jspcal。我同意“bulk_uitem”表,但我不会说使用逗号分隔的列表“很好”。我怀疑他们只是出于礼貌,不会认可一个不是第一标准形式的设计

jspcal建议的设计通常被称为“”,是处理复合产品等问题的唯一明智的方法


为了有效地将其用于交易表,您应该包括交易类型代码以及SKU和数量。您在任何给定SKU中的库存可能会上升或下降,原因各不相同。最常见的是收到新股票和客户购买股票。然而,还有其他一些事情,比如人工调整库存,以考虑到文书错误和收缩。还有一些股票转换,比如当你决定把一个品种包装成单独的产品出售时。不要认为你可以依靠数量是正是负来为你提供足够的信息,让你能够了解你的库存水平以及库存水平如何(以及为什么)发生变化。

谢谢,我努力创建一个单独的表,其中包含纯大宗商品。但是,有时可能会有不同的大宗商品包含相同的单个商品。例如,可能有几种不同包装的薯片,而所有三种包装都有纳乔多力托斯。您的解决方案是我的第一个爱好,直到我意识到单个项目可以与多个散装包装关联。jspcal建议N:M。散装包装项目表是一个交集表(多对多),其中父项和子项都是产品。你可以把你的多丽托斯辣椒酱作为派对综艺套餐、山姆散装套餐、万圣节套餐的一部分,并且可以自己享用。您仍然只需要一个子表。@dmitrobidiu这是仓储、配送和零售中常见的场景。库存的变动不仅仅是销售。还有退货和换装,就像你描述的那样。当您将一个SKU分解为其他SKU时,通常不会以一对一的方式进行。您的物料清单将告诉您一个SKU中有多少个在另一个SKU中(两包可乐中有两罐可乐),因此您将知道每个SKU的借方和贷方数量。您想在库存移动标题中添加一个
type_code
,以描述它是销售、退货还是包装中断。@dmitrobidiu-是的,就是这样。用实际的、物理的术语来考虑它。如果你拆开了一包罐头(打开盒子或切断塑料包装),那么你就再也没有那包了。相反,你有一堆松散的罐子。这就像你“卖”了一个包装,“买”了24个单独的罐作为你的库存——当然,除了你“买”给你自己和“卖”给你自己(即在你自己的库存中)。@Dmitrobidiu在分配SKU时,你不应该想得太多。将SKU与您可以实际销售的单元绑定。没有“55件行李中有53件可以打滑”的SKU,这是不合理的。如果你可以卖一个完整的滑橇,那么考虑一个SKU的全滑橇和一个单一的袋子。或者,您可以忽略55件行李会打滑的事实,一件行李只有一个SKU。拥有SKU的原因是为了定价和销售,而不是为了库存跟踪。@DIU的借项和贷项在库存移动的每一部分都应该相等,但是如果你把一个滑动分解成一个袋子,实际上是两个(相关的)库存移动。想象一下,把一个雪橇分解成袋子,就像卖了一个雪橇,买了55个袋子一样。垫木库存在仓库中减少1,在内部转移部门中增加1。这相当于一个客户销售账户,数字永远不会下降。然后,内部运输部门获得55袋的库存(这就像供应商交付),然后将其转移到仓库。每一半余额。