库存管理数据库设计

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),因此我的库存始终是正确的(相对于上面的查询),我从不手动更新库存表。