机房重构

编程入门 行业动态 更新时间:2024-10-10 21:28:41

<a href=https://www.elefans.com/category/jswz/34/1765269.html style=机房重构"/>

机房重构

    在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确实没有必要。

 

更多推荐

机房重构

本文发布于:2024-02-27 22:39:30,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1766490.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:机房   重构

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!