机房重构---卡表中Status字段引起的“链式反应”

2024-08-26 21:38

本文主要是介绍机房重构---卡表中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字段引起的“链式反应”的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1109757

相关文章

mysql数据库member中telephone字段被篡改

现在准备查询log日志文件,看下被操作的原因是什么

java的Timestamp时间插入mysql的datetime字段是0000-00-00 00:00:00

Mysql 与 java 的时间类型             MySql的时间类型有              Java 中与之对应的时间类型                  date                                               java.sql.Date               Datetime

PL/SQL工具创建Oracle数据库表,实现id字段的自动递增

通过PL/SQL工具,创建Oracle数据库表,如何实现字段ID自动递增; Oracle的自增需要依靠序列和触发器共同实现 比如:先创建一个表 create table test (id int primary key, name varchar2(10)); 创建一个序列 create sequence test_seq increment by 1 start with 1  min

Mybatis Plus快速重构真批量sql入库操作

Mybatis快速重构真批量sql入库操作 基本思路 重构mybatis默认方法saveBatch和saveOrUpdateBatch的实现 基本步骤 真批量保存实现类InsertBatchMethod真批量更新实现类MysqlInsertOrUpdateBath注册InsertBatchMethod和MysqlInsertOrUpdateBath到EasySqlInjector注册Eas

概率DP (由一道绿题引起的若干问题。目前为一些老题,蒟蒻的尝试学习1.0)

概率DP: 利用动态规划去解决 概率 期望 的题目。 概率DP 求概率(采用顺推) 从 初始状态推向结果,同一般的DP类似,只是经历了概率论知识的包装。 老题: 添加链接描述 题意: 袋子里有w只白鼠,b只黑鼠,A和B轮流从袋子里抓,谁先抓到白色谁就赢。A每次随机抓一只,B每次随机 抓完一只后 会有另外一只随机老鼠跑出来。如果两个人都没有抓到白色,那么B赢。A先抓,问A赢得概率。 w b 均在

搭建服务器机房的标准是什么?

企业在进行选择服务器时,可能会将服务器放置公司,但是大多数企业还是会选择服务器租用或托管服务,因为专业的IDC服务商通常能够提供良好的机房环境来进行放置服务器,接下来小编就主要来介绍一下搭建服务器机房的标准都有哪些吧! 首先对于机房的位置选择要保证原理水源、油库和化工厂等危险的场所,并且不应该建设在容易受到水灾和地震等自然灾害影响的地区当中,防止出现不可遏制的情况发生,造成重大的经济损失。

[机缘参悟-222] - 系统的重构源于被动的痛苦、源于主动的精进、源于进化与演进(软件系统、思维方式、亲密关系、企业系统、商业价值链、中国社会、全球)

目录 前言:系统的重构源于被动的痛苦、源于主动的精进、源于进化与演进 一、软件系统的重构 1、重构的定义与目的 2、重构的时机与方法 3、重构的注意事项 4、重构的案例分析 二、大脑思维的重构 1、大脑思维重构的定义 2、大脑思维重构的方法 3、大脑思维重构的挑战与前景 三、认知的重构 1、定义 2、目的 3、方法 四、实例 五、总结 四、婚姻家庭的重构 1、婚

MQTT协议中信息长度MSG len字段分析

截图自: 主要是说数据字节长度的计算: 每个字节由1个持续位和7个数据位组成:如果持续位为1,表示接下来的一个字节仍然表示长度的一部分 7个数据位表示的数据     0-127   共计128个数字 所以如上图的表格所示 1个字节,2个字节,3个字节,4个字节的数据范围 切记:MQTT长度的表示范围 最多使用4个字节  故这里存在着数据长度的限制  (不过真心牛掰! 试试Q

总结如何成为“好”代码——读《重构:改善既有代码的设计》有感

读后感 说是“读后感”,其实并不是看得很仔细,尤其是各种代码例子,我基本上是跳过的。个人觉得,重构这件事上,关键是要能嗅出坏代码,知道什么是好代码,这样目标明确后,重构的手段其实是水到渠成的,唯一要注意的就是书中强调的:要以小步为单位稳打稳扎进行。 我所理解的“好”代码 核心目标 那么如何才是“好”代码?书中的答案是:“人们是否能轻而易举地修改”,而我觉得抽象层级更高的描述是:易于未来的工

UTON HACK 4.0 黑客马拉松大赛在马来西亚引起巨大反响

自第四届UTON HACK黑客马拉松大赛开启报名以来,吸引了全世界范围内区块链技术精英的广泛参与,在东南亚地区特别是马来西亚引起了巨大反响。 近日,马来西亚主流媒体Delight Media Malaysia对本次黑客马拉松大赛的协办单位马来西亚何氏全球总商会、UM公司进行了专访。 前排左一起是何致呈、何德成、何伟贤、尼克及马克。 (Delight Media Malaysia摄) 马来