产品与库存之间的关系

时间:2013-01-29 11:15:53

标签: mysql database tsql database-design relational-database

我正在开发一个库存控制数据库,并希望了解在productsstocks实体之间建立关系的最佳方式。

以下哪项适合?如果没有,请告诉我为什么以及你的建议是什么。

提前致谢

产品 - 股票

基于以上实体:

  • 如果我有1:1关系,看起来我必须减少库存 通过使用UPDATE语句更新行,将金额放在同一行中。

  • 如果我有1:n关系,看起来我必须添加一个新行 使用INSERT声明更新库存量。

重要要点

  • 将会有并发用户操纵股票,例如增加和/或减少,因此[ACID][1]非常重要。

  • Stock amount为非负值。

2 个答案:

答案 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保证是不够的。例如:

  • 交易 A 选择当前的AMOUNT,让我们说它是5。
  • 事务 B 选择当前的AMOUNT,这仍然是5,因为还没有其他事务提交任何更改。
  • 交易 A 将金额加2,结果为7。
  • 交易 B 为金额增加3,结果为8。
  • 交易 A 将行更新为7并提交。
  • 事务 B 将行更新为8并提交。

突然,表中的结果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.