Tôi cũng có nhu cầu tương tự và đây là cách tôi giải quyết vấn đề di chuyển cổ phiếu của bạn (vấn đề này cũng trở thành vấn đề của tôi).
Để mô hình hóa chuyển động cổ phiếu (+/-), tôi có supplying
và order
của tôi những cái bàn. Việc cung cấp đóng vai trò là + cổ phiếu của tôi và đơn đặt hàng của tôi - nguyên liệu của tôi.
Nếu chúng ta dừng lại ở điều này, chúng ta có thể tính toán kho thực tế của chúng ta sẽ được phiên âm thành truy vấn SQL này:
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
Điều này sẽ cung cấp một cái gì đó như:
id name stock
=========================
1 ASUS Vivobook 3
2 HP Spectre 10
3 ASUS Zenbook 0
...
Mặc dù điều này có thể giúp bạn tiết kiệm một bảng, nhưng bạn sẽ không thể mở rộng quy mô với nó, do đó thực tế là hầu hết các mô hình hóa (imho) sử dụng một stock
trung gian , chủ yếu là cho các mối quan tâm về hiệu suất.
Một trong những nhược điểm là dữ liệu trùng lặp, vì bạn sẽ cần phải chạy lại truy vấn ở trên để cập nhật kho hàng của mình (xem phần updatedAt
cột).
Mặt tốt là hiệu suất của khách hàng. Bạn sẽ gửi phản hồi nhanh hơn thông qua API của mình.
Tôi nghĩ rằng một nhược điểm khác có thể là nếu bạn đang quản lý cửa hàng lưu lượng truy cập cao. Bạn có thể tưởng tượng việc tạo một bảng khác lưu trữ thực tế rằng một kho hàng đang được tính toán lại và khiến người dùng đợi cho đến khi tính toán lại hoàn tất (yêu cầu đẩy hoặc bỏ phiếu dài) để kiểm tra xem mọi mặt hàng của họ vẫn còn hàng (kho> =nhu cầu của người dùng). Nhưng đó là một thỏa thuận khác ...
Dù sao, ngay cả khi truy vấn tính toán lại kho đang sử dụng truy vấn con ẩn danh, nó thực sự phải đủ nhanh trong hầu hết các cửa hàng tương đối trung bình.
Lưu ý
Bạn thấy trong product_order
, Tôi đã sao chép giá và thùng. Điều này là vì lý do đáng tin cậy:để cố định giá tại thời điểm mua và có thể tính toán lại tổng số với nhiều số thập phân (mà không bị mất xu).
Hy vọng nó sẽ giúp ai đó đi ngang qua.
Chỉnh sửa
Trong thực tế, tôi sử dụng nó với Laravel và tôi sử dụng lệnh bảng điều khiển , sẽ tính toán kho sản phẩm của tôi theo lô (tôi cũng sử dụng một tham số tùy chọn để chỉ tính toán cho một id sản phẩm nhất định), vì vậy kho hàng của tôi luôn chính xác (liên quan đến truy vấn ở trên) và tôi không bao giờ cập nhật bảng kho theo cách thủ công.