本文主要是介绍机房重构---卡表中Status字段引起的“链式反应”,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
在Card_Info表中,有一个字段是“Status”,这篇博客的由来就是我在考虑Status这个字段到底有没有用的过程中产生的。 ---题记
问题是在敲“退卡”操作时候引发的,先理一下我当时的思路:
(1)判断将要注销的卡的IsCheck字段是否为“已结账”。
(2)满足上述条件后,通过触发器将要退卡的记录备份到CancenCard_Info表中。
(3)删除Card_Info表中相应的记录。
为什么要这样设计:保证卡表不会出现主键重复的错误,如图:
简单说,当退卡之后删除卡表中相应的记录,保证原有卡号仍然能够被注册,如果不删除的话虽然Status显示“未使用”,but相应的卡号已经不能够再次使用,因为primary key会重复,但是如果设置复合主键的话,又没有必要。
于是引出一个问题:卡表中的Status是不是真的没有用呢?
今天上午,我看之前VB6.0版本的页面设计,发现在“结账”窗体上有一个“售卡张数”的txt文本框,我当时就傻了,Why?因为这推翻了我上面的思路。
针对“退卡”,有两种思路:
(一)、可以在退卡后将卡表中的Status字段该为“未使用”,
(二)、退卡之后直接将记录“剪切”到CancelCard表中(当然有人的数据库中没有设计CancelCard表……)
两种方法各有利弊:
思路一:当卡注销之后,该卡号不可以被再次使用,即使使用了,也相当于把该卡激活,该卡卡号还是之前的学生。
思路二:退卡功能完全能很简便的实现,代码量不大,同时保证了退卡后,卡号能够被再次利用,但是在结账过程中会引发“售卡张数不对”的bug。
如何能够既保证退卡后卡号仍然能够使用,而且在结账时候不会发生错误呢?
我后来找到一个方法能够将两种思路结合起来:
在Card_Info中设置一个CancelHolder字段,允许为NULL值;在CancelCard_Info中设置一个RegisterHolder字段,不能为NULL值。如图:
设计改进:
(1)仍然在退卡后,删除Card_Info中的退卡信息,确保该卡号能被再次使用
(2)在判断卡表相应记录的IsCheck字段是否为“已结账”成功之后,在Card_Info表中添加CancelHolder字段信息,目的将“退卡”操作执行者以触发器的方式“剪切”到CancelCard_Info表中,省去了对D层的两次调用,而且省去了在D层相应退卡表的类中写“Inset”方法。
(3)上述原有思路中的(3)、(4)
那么,结账时候“售卡张数”怎么查?兵分两路,在Card_Info和CancelCard_Info(以RegisterHolder为条件查询)中同时查询,解决了上述的所有问题。
还有一个解决“售卡张数bug”的方法,另外创建一张表,两个字段“Holder”和“Data”触发器执行过程中向其中添加记录,完美解决这个问题。
这样回头去想,Status确实没有必要。
这篇关于机房重构---卡表中Status字段引起的“链式反应”的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!