[英]Stock management database design
我正在为我的公司创建一个 Intranet,我们希望在其中进行库存管理。 我们销售和出租警报系统,我们希望很好地了解我们办公室中还有哪些产品、哪些产品已出租或出售、什么时间等。
目前我想到了这个数据库设计:
每次我们创建一个新合同时,这个合同都是关于一个地点或一个项目的销售。 所以我们有一个 Product 表(它是产品的类型:闹钟、闹钟等)和一个 Item 表,它是项目本身,带有唯一的序列号。 我考虑过这样做,因为我需要跟踪特定物品的位置,如果它在客户房屋(租用),是否已售出等。产品与特定供应商有关,我们可以与谁联系接受命令。 但是在这里,我有一个问题,订单表不应该与 Product 相关吗?
这里主要关注的是库存、项目、运动库存之间的联系。 我想创建一个设计,让我能够看到特定项目何时从我们的库存中撤出,以及何时进入带有日期的库存。 这就是为什么我想到了 Movement_stock 表。 Type_Movement 是输入/输出。 但是我在这里有点迷茫,我真的不知道该怎么做。 这就是为什么我需要一些帮助。
我有同样的需求,这是我如何解决您的库存变动问题(这也成为我的问题)。
为了对库存变动 (+/-) 进行建模,我有我的supplying
表和order
表。 供应作为我的+库存,我的订单是我的-库存。
如果我们停下来,我们可以计算我们的实际库存,并将其转录为这个 SQL 查询:
SELECT
id,
name,
sup.length - ord.length AS 'stock'
FROM
product
# Computes the number of items arrived
INNER JOIN (
SELECT
productId,
SUM(quantity) AS 'length'
FROM
supplying
WHERE
arrived IS TRUE
GROUP BY
productId
) AS sup ON sup.productId = product.id
# Computes the number of order
INNER JOIN (
SELECT
productId,
SUM(quantity) AS 'length'
FROM
product_order
GROUP BY
productId
) AS ord ON ord.productId = product.id
这会给出类似的东西:
id name stock
=========================
1 ASUS Vivobook 3
2 HP Spectre 10
3 ASUS Zenbook 0
...
虽然这可以为您节省一张表,但您将无法使用它进行扩展,因此大多数建模(恕我直言)使用中间stock
表,主要是出于性能考虑。
缺点之一是数据重复,因为您需要重新运行上面的查询来更新您的库存(请参阅updatedAt
列)。
好的一面是客户的表现。 您将通过 API 提供更快的响应。
我认为另一个缺点可能是如果您正在管理高流量商店。 您可以想象创建另一个表来存储正在重新计算库存的事实,并让用户等待直到重新计算完成(推送请求或长轮询)以检查他/她的每个项目是否仍然可用(库存>= 用户需求)。 但这是另一笔交易......
无论如何,即使股票重新计算查询使用匿名子查询,它实际上在大多数相对中等的商店中应该足够快。
注意
您在product_order
看到,我复制了价格和增值税。 这是出于可靠性的原因:在购买时冻结价格,并能够用大量小数重新计算总数(不会丢失美分)。
希望能帮到路过的人。
编辑
在实践中,我将它与Laravel一起使用,并且我使用了一个控制台命令,它将批量计算我的产品库存(我还使用了一个可选参数来仅计算某个产品 id),因此我的库存始终是正确的(相对于上面的查询),我从不手动更新库存表。
这是一个有趣的讨论,并且还可以增加某个日期的库存可用性......这意味着存储:
这些产品移动中的每一个都可能来自和到达一个位置
用户查询将包括:
库存设计必须考虑到用户的查询和用例来确定设计并打破规范化规则以在正确的时间提供足够的性能。
需要考虑很多,这一切都取决于软件用例。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.