我正在为我的公司创建一个Intranet,我们希望在其中有一个库存管理。我们销售和租赁报警系统,我们希望能够很好地了解我们办公室中的产品,租借或出售的产品,时间等等。
目前我想到了这个数据库设计:
每次我们创建新合同时,此合同都是关于商品的位置或销售。因此,我们有一个产品表(产品类型:报警,报警手表等),以及一个项目表,它是项目本身,具有唯一的序列号。我想过这样做,因为我需要跟踪一个特定项目的位置,如果它在客户公寓(租用),是否已售出等等。产品与特定供应商有关,我们可以向他们提供接受命令。但是在这里,我有一个问题,订单表不应该与Product相关吗?
这里主要关注的是股票,项目,运动股票之间的联系。我想创建一个设计,我可以看到什么时候从我们的库存中取出一个特定的项目,以及它何时进入带有日期的股票。这就是为什么我想到一个Movement_stock表。 Type_Movement是In / Out。 但是我在这里有点迷失,我真的不知道怎么做得很好。这就是为什么我要求一些帮助。
答案 0 :(得分:0)
我也有同样的需求,这就是我解决您的库存变动问题(这也成为我的问题)的方式。
为了模拟库存变动(+/-),我有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
...
虽然这可以为您节省一张表,但您将无法进行扩展,因此大多数建模(imho)使用中间的stock
表这一事实,主要是出于性能方面的考虑。
缺点之一是数据重复,因为您将需要重新运行上面的查询以更新库存(请参见updatedAt
列)。
好的方面是客户表现。您将通过API提供更快的响应。
我认为,如果您要管理高流量商店,则还有另一个缺点。您可以想象创建另一个表来存储要重新计算库存的事实,并让用户等到重新计算完成(推送请求或长时间轮询)后,才能检查他/她的每个项目是否仍然可用(库存) > =用户需求)。但这是另一笔交易...
无论如何,即使库存重新计算查询使用匿名子查询,在大多数相对中等的商店中,它实际上也应该足够快。
注意
您在product_order
中看到,我复制了价格和增值税。这是出于可靠性方面的考虑:在购买时冻结价格,并能够用很多小数位重新计算总数(不会造成损失)。
希望它可以帮助路过的人。
修改
在实践中,我将其与Laravel一起使用,并且我将使用console command来批量计算我的产品库存(我也使用可选参数仅针对特定产品ID进行计算) ,因此我的库存总是正确的(相对于上面的查询),并且我从不手动更新库存表。
答案 1 :(得分:0)
这是一个有趣的讨论,并且还可以增加某个日期的库存可用性... 这意味着存储:
这些产品移动中的每一个都可能来自和到达一个位置
用户查询将包括:
清单设计必须考虑到用户的查询和用例,以确定设计并打破规范化规则,以在适当的时间提供足够的性能。
需要考虑很多,这完全取决于软件用例。