Stock management database design

前端 未结 1 1443
野的像风
野的像风 2021-02-10 05:06

I\'m creating an Intranet for my company, and we want to have a stock management in it. We sell and rent alarm systems, and we want to have a good overview of what product is st

相关标签:
1条回答
  • 2021-02-10 05:23

    I have the same need, and here is how I tackled your stock movement issue (which became my issue too).

    In order to modelize stock movement (+/-), I have my supplying and my order tables. Supplying act as my +stock, and my orders my -stock.

    If we stop to this, we could compute our actual stock which would be transcribed into this SQL query:

    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
    

    Which would give something like:

    id  name            stock
    =========================
     1  ASUS Vivobook       3
     2  HP Spectre         10
     3  ASUS Zenbook        0
        ...
    

    While this could save you one table, you will not be able to scale with it, hence the fact that most of the modelization (imho) use an intermediate stock table, mostly for performance concerns.

    One of the downside is the data duplication, because you will need to rerun the query above to update your stock (see the updatedAt column).

    The good side is client performance. You will deliver faster responses through your API.

    I think another downside could be if you are managing high traffic store. You could imagine creating another table that stores the fact that a stock is being recomputed, and make the user wait until the recomputation is finished (push request or long polling) in order to check if every of his/her items are still available (stock >= user demand). But that is another deal...

    Anyway even if the stock recomputation query is using anonymous subqueries, it should actually be quite fast enough in most of the relatively medium stores.

    Note

    You see in the product_order, I duplicated the price and the vat. This is for reliability reasons: to freeze the price at the moment of the purchase, and to be able to recompute the total with a lot of decimals (without loosing cents in the way).

    Hope it helps someone passing by.

    Edit

    In practice, I use it with Laravel, and I use a console command, which will compute my product stock in batch (I also use an optional parameter to compute only for a certain product id), so my stock is always correct (relative to the query above), and I never manually update the stock table.

    0 讨论(0)
提交回复
热议问题