我在一个库存跟踪web应用程序中工作。我在设计用户界面时遇到了一些问题,特别是编辑采购清单。
下面是我的Purchase表的概述数据结构
+------+-------+------+------+-----------
| ID | Name | Price| QTY | Date |
+------+-------+------+------+-----------
|B03-13|Goods1 |10000 |10 |2014-3-10
|B03-14|Goods2 |10000 |20 |2014-3-10
|B03-13|Goods3 |20000 |5 |2014-4-10平均价格表
+------+----------+----------
| ID | Avg Price| Date |
+------+----------+----------
|B03-13|1000 |2014-3-10
|B03-13|500 |2014-3-10
|B03-13|2000 |2014-4-10计算移动平均价格(价格*总)/总库存
假设我们有1000行数据,当我们编辑一个数据时,说它是第三个数据,当然,应用程序会再次计算整个数据。编辑行将导致最终平均价格变化。所以我必须计算它之后的整行(在用户编辑的行之后),检查“平均价格”表并更新相关数据,每次用户进行更改。
在这种情况下,我们应该放弃“编辑数据”功能,还是只允许用户编辑他们最后插入的数据?
谢谢你的回答,我希望这对其他有同样问题的人有帮助。
发布于 2014-03-28 12:25:09
你的问题有多个方面,而且非常宽泛。我将重点介绍一些随意选择的细节,其他方面可能会涉及其他方面。
如何处理一个用户对多个DB表的相关更改?
这是通过将所有更改放入单个事务中来完成的。这样一来,当你改变价格或添加新的购买时,给定商品的平均价格将同时发生变化。对于外部观察者,他们既可以看到旧数据,也可以看到新数据,但不能看到不一致的数据,其中一个表已更改,但另一个表尚未更改。当然,这必须考虑数据库的实现细节,以及其事务系统和存储后端提供的ACID guarantees类型。
如何处理多个用户对同一DB表的更改?
一种方法是锁定相关的数据库行,以防止其他人更改它们,只要公开给定数据以进行修改的用户界面会话启动即可。
另一种方法是向用户更改的所有表中添加一个Generation列。当获取用户界面数据时,也会获取世代号。当提交更改事务时,所有查询都使用where Purchase.Generation = ...等进行限定。这样,任何源自陈旧数据的更改都将失败。
另一种与generation列互操作的方法是提交相关事务,而不是绑定到某个层代,而是作为不关心现有值的更改事务。例如,如果您以一定的价格收到了一定数量的小部件,那么在Purchase表中,您要么添加到现有行,要么创建新行。在AvgPrice表中,您将根据Purchase表中的相关值自动修改该值。因此,其他用户可能同时购买了相同的商品并不重要:无论发生什么,数据库都将保持一致,而您获得100多个商品的操作将导致以下结果:某个地方的计数器将会上升(在现有的或新的行中)。这就像是银行账户上的一笔存款交易。
当然,从业务角度来看,我们可能仍然希望这样的事务失败,因为可能原始用户不再需要购买这100件商品。
如何向用户呈现失败的事务?
这取决于上下文。有时,就像在银行存款的情况下一样,您什么也不做,只需重试相同的事务,因为事务具有“增量”语义而不是“用新值替换”语义。取款是类似的,但不完全是:它是一个“增量”事务,但它可能会以两种方式失败:
其他时候,除了用于生成事务的数据之外,还可以向用户呈现更新后的数据,并突出显示已更改的内容。这取决于数据的呈现方式。例如,在inventory表中,您可以直观地指出“同时”更改的字段。然后,系统将提示用户为这些字段重新输入所需的值或增量,以明确确认仍然需要相同的更改。鉴于其他人已经订购了相同的小部件,这将迫使重新考虑购买小部件。
https://stackoverflow.com/questions/22703894
复制相似问题