Mysql
 sql >> база данни >  >> RDS >> Mysql

Проектиране на база данни за управление на запасите

Имам същата нужда и ето как се справих с проблема ви с движението на акциите (което стана и мой проблем).

За да моделирам движението на запасите (+/-), имам моя 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 , и използвам конзолна команда , който ще изчисли наличността на моя продукт в партида (използвам също и незадължителен параметър за изчисляване само за определен идентификатор на продукт), така че моята наличност винаги е правилна (спрямо заявката по-горе) и никога не актуализирам ръчно таблицата за наличности.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. ще покаже състоянието на таблицата, показва точните редове в таблицата?

  2. номер на порт на mysql сървъра

  3. Таблицата е посочена два пъти, и като цел за 'UPDATE' и като отделен източник за данни в mysql

  4. EXPLAIN и COUNT връщат две различни стойности

  5. Как да разширя EER диаграма в MySQL Workbench?