Kom*_*zer 7 mysql sql database database-design
我正在为我的公司创建一个 Intranet,我们希望在其中进行库存管理。我们销售和出租警报系统,我们希望很好地了解我们办公室中还有哪些产品、哪些产品已出租或出售、什么时间等。
目前我想到了这个数据库设计:
每次我们创建一个新合同时,这个合同都是关于一个地点或一个项目的销售。所以我们有一个 Product 表(它是产品的类型:闹钟、闹钟等)和一个 Item 表,它是项目本身,它有唯一的序列号。我考虑过这样做,因为我需要跟踪特定物品的位置,如果它在客户房屋(租用),是否已售出等。产品与特定供应商有关,我们可以与谁联系接受命令。但是在这里,我有一个问题,订单表不应该与 Product 相关吗?
这里主要关注的是库存、项目、运动库存之间的联系。我想创建一个设计,让我能够看到特定项目何时从我们的库存中取出,以及何时进入库存并带有日期。这就是为什么我想到了 Movement_stock 表。Type_Movement 是输入/输出。但是我在这里有点迷茫,我真的不知道该怎么做。这就是为什么我需要一些帮助。
Anw*_*war 12
我有同样的需求,这是我如何解决您的库存变动问题(这也成为我的问题)。
为了模拟股票运动 (+/-),我有我的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
Run Code Online (Sandbox Code Playgroud)
这会给出类似的东西:
id name stock
=========================
1 ASUS Vivobook 3
2 HP Spectre 10
3 ASUS Zenbook 0
...
Run Code Online (Sandbox Code Playgroud)
虽然这可以为您节省一张表,但您将无法使用它进行扩展,因此大多数建模(恕我直言)使用中间stock表,主要是出于性能考虑。
缺点之一是数据重复,因为您需要重新运行上面的查询以更新您的库存(请参阅该updatedAt列)。
好的一面是客户的表现。您将通过 API 提供更快的响应。
我认为另一个缺点可能是如果您正在管理高流量商店。您可以想象创建另一个表来存储正在重新计算库存的事实,并让用户等待直到重新计算完成(推送请求或长轮询)以检查他/她的每个项目是否仍然可用(库存>= 用户需求)。但这是另一笔交易......
无论如何,即使股票重新计算查询使用匿名子查询,它实际上在大多数相对中等的商店中应该足够快。
笔记
你在 中看到product_order,我复制了价格和增值税。这是出于可靠性的原因:在购买时冻结价格,并能够用大量小数重新计算总数(不会丢失美分)。
希望对路过的人有所帮助。
编辑
在实践中,我将它与Laravel一起使用,并且我使用了一个控制台命令,它将批量计算我的产品库存(我还使用了一个可选参数来仅计算某个产品 id),因此我的库存始终是正确的(相对于上面的查询),我从不手动更新库存表。