Rất tốt — với mô hình bạn đã thiết kế, ta có thể đánh giá tính logic khi nhập 4 loại sản phẩm như sau:
✅ 1. Sản phẩm thông thường
(Sản phẩm không có biến thể, không có lô)
✅ Hợp lý khi:
-
ProductId có trong [Products]
-
VariantId = '00000000-0000-0000-0000-000000000000' (mặc định)
-
LotId = '00000000-0000-0000-0000-000000000000' (mặc định)
-
StockPerStore và TransactionsStock xử lý đúng bộ 4 khóa
👉 Không cần nhập ProductVariants hay ProductLots
✅ 2. Sản phẩm có biến thể
(Ví dụ: quần áo có size/màu)
✅ Hợp lý khi:
-
Products: là sản phẩm cha
-
ProductVariants: chứa từng biến thể (size M, màu đỏ...)
-
StockPerStore: tồn theo ProductId + VariantId, LotId mặc định
-
TransactionsStock: ghi nhận theo biến thể
⚠ Logic cần đảm bảo:
-
VariantId bắt buộc có, liên kết đúng với ProductId
-
LotId vẫn để mặc định '00000000-0000-0000-0000-000000000000'
✅ 3. Sản phẩm theo lô
(Thuốc, thực phẩm cần hạn dùng, quản lý theo lô nhập)
✅ Hợp lý khi:
-
Products: như bình thường
-
ProductVariants: không cần dùng (nếu không có biến thể)
-
LotId: là real LotId, liên kết đến ProductLots (chứa ExpiryDate)
-
VariantId: mặc định '0000...'
-
StockPerStore: tồn kho theo từng LotId
-
TransactionsStock: ghi nhận đúng LotId
⚠ Logic cần đảm bảo:
✅ 4. Sản phẩm có cả biến thể và lô
✅ Hợp lý khi:
-
Products: sản phẩm cha
-
ProductVariants: định nghĩa từng biến thể
-
ProductLots: định nghĩa các lô theo VariantId
-
StockPerStore: tồn theo bộ khóa:
-
TransactionsStock: mỗi giao dịch phải ghi đủ 3 trường: ProductId, VariantId, LotId
⚠ Logic cần đảm bảo:
⚠️ Tóm tắt điều kiện kiểm tra tính logic khi nhập hàng
| Loại SP |
ProductId |
VariantId |
LotId |
Ghi chú logic bắt buộc |
| Sản phẩm thông thường |
✅ |
'0000-0000…' |
'0000-0000…' |
Không dùng bảng Variants, Lots |
| Sản phẩm có biến thể |
✅ |
✅ Variants.VariantId |
'0000-0000…' |
Có dòng VariantId đúng với ProductId |
| Sản phẩm có lô |
✅ |
'0000-0000…' |
✅ Lots.LotId |
LotId phải thuộc VariantId mặc định |
| Sản phẩm có biến thể và lô |
✅ |
✅ Variants.VariantId |
✅ Lots.LotId (của biến thể đó) |
Phải đúng cả VariantId và LotId liên kết |
🧪 Bạn nên kiểm tra các lỗi logic thường gặp:
-
✅ LotId không tồn tại trong ProductLots → ❌ lỗi logic
-
✅ VariantId không thuộc ProductId → ❌ sai biến thể
-
✅ StockPerStore bị trùng dòng với tổ hợp (StoreId, ProductId, VariantId, LotId) → ❌ vi phạm UNIQUE