我正在开发一个库存控制数据库,并希望了解在products
和stocks
实体之间建立关系的最佳方式。
以下哪项适合?如果没有,请告诉我为什么以及你的建议是什么。
提前致谢
产品 - 股票
基于以上实体:
如果我有1:1
关系,看起来我必须减少库存
通过使用UPDATE
语句更新行,将金额放在同一行中。
如果我有1:n
关系,看起来我必须添加一个新行
使用INSERT
声明更新库存量。
重要要点
将会有并发用户操纵股票,例如增加和/或减少,因此[ACID][1]
非常重要。
Stock amount
为非负值。
答案 0 :(得分:2)
取决于你想要完成的任务。
如果您需要一个描述产品可用数量的简单数字,只需将其存储在产品表中的字段中即可。在单个语句中更新它是原子的:
UPDATE PRODUCT
SET AMOUNT = AMOUNT + <change>
WHERE PRODUCT_ID = <whatever>
或者,您可以这样做:
START TRANSACTION;
SELECT AMOUNT
FROM PRODUCT
WHERE PRODUCT_ID = <whatever>
FOR UPDATE;
(Calculate new amount.)
UPDATE PRODUCT
SET AMOUNT = <new amount>
WHERE PRODUCT_ID = <whatever>;
COMMIT;
注意FOR UPDATE将行锁定到COMMIT,并防止在并发环境中可能出现的异常。
如果没有FOR UPDATE,只需定期的ACID保证是不够的。例如:
突然,表中的结果AMOUNT是5 + 3 = 8,即使它应该是5 + 2 + 3 = 10.其中一个更改丢失了 - 谁提交最后一次胜利。
如果您需要产品数量的历史记录,或者需要跟踪个别&#34;实例&#34;然而,是的,您需要一个1:N关系的单独表,这可能在并发环境中有自己的锁定挑战。
库存量是非负值。
不幸的是,MySQL并没有强制执行CHECK约束,但对于这种特定情况,您只需使用UNSIGNED数据类型之一。
答案 1 :(得分:1)
depends
上的no. of users updating/inserting rows
,以及depends on
您的系统可承受的内存开销或性能
更新
在mysql - update needs write lock
,
所以,对于很多用户来说,性能消耗,系统会比较慢。
插入
内存消耗:比如对于100个用户100行可能会有更多更新100行。
我认为1:1 relation ship is better
因为
如果您当时正在提供1:n
关系,
增加股票:
-you 'll add new row .
-so for total stock
- you have to add all the subsequent rows,if new value you are inserting
is only the incremented amt
- or if it is the total increased amt the previous rows would not have
any significance.
减少库存, 同样,
-if the total decrement amt you are inserting then the previous data has
no significance,
-but if only decrement value is there , so for every user you have to put
a check over the total stock which you would get from many rows.