我有同样的需求,这就是我如何解决你的股票变动问题(这也成为我的问题)。
为了模拟股票走势(+/-),我有我的supplying
and my 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 提供更快的响应。
我认为另一个缺点可能是如果您管理的是高流量商店。您可以想象创建另一个表来存储正在重新计算库存的事实,并让用户等到重新计算完成(推送请求或长轮询)以检查他/她的每个商品是否仍然可用(库存) >= 用户需求)。但这是另一回事......
无论如何,即使股票重新计算查询使用匿名子查询,它实际上在大多数相对中等的商店中应该足够快。
Note
你看到在product_order
,我复制了价格和增值税。这是出于可靠性原因:在购买时冻结价格,并能够使用大量小数重新计算总数(不会损失任何美分)。
希望对路过的人有帮助。
Edit
在实践中,我将它与Laravel https://laravel.com/,我用一个控制台命令 https://laravel.com/docs/master/artisan#writing-commands,它将批量计算我的产品库存(我还使用可选参数仅计算某个产品 ID),因此我的库存始终是正确的(相对于上面的查询),并且我从不手动更新库存表。