机房重构---卡表中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中动态生成SQL语句去掉所有字段的空格的操作方法

《MySQL中动态生成SQL语句去掉所有字段的空格的操作方法》在数据库管理过程中,我们常常会遇到需要对表中字段进行清洗和整理的情况,本文将详细介绍如何在MySQL中动态生成SQL语句来去掉所有字段的空... 目录在mysql中动态生成SQL语句去掉所有字段的空格准备工作原理分析动态生成SQL语句在MySQL

Mysql表如何按照日期字段的年月分区

《Mysql表如何按照日期字段的年月分区》:本文主要介绍Mysql表如何按照日期字段的年月分区的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、创键表时直接设置分区二、已有表分区1、分区的前置条件2、分区操作三、验证四、注意总结一、创键表时直接设置分区

Python获取C++中返回的char*字段的两种思路

《Python获取C++中返回的char*字段的两种思路》有时候需要获取C++函数中返回来的不定长的char*字符串,本文小编为大家找到了两种解决问题的思路,感兴趣的小伙伴可以跟随小编一起学习一下... 有时候需要获取C++函数中返回来的不定长的char*字符串,目前我找到两种解决问题的思路,具体实现如下:

MySQL新增字段后Java实体未更新的潜在问题与解决方案

《MySQL新增字段后Java实体未更新的潜在问题与解决方案》在Java+MySQL的开发中,我们通常使用ORM框架来映射数据库表与Java对象,但有时候,数据库表结构变更(如新增字段)后,开发人员可... 目录引言1. 问题背景:数据库与 Java 实体不同步1.1 常见场景1.2 示例代码2. 不同操作

MySQL 中的服务器配置和状态详解(MySQL Server Configuration and Status)

《MySQL中的服务器配置和状态详解(MySQLServerConfigurationandStatus)》MySQL服务器配置和状态设置包括服务器选项、系统变量和状态变量三个方面,可以通过... 目录mysql 之服务器配置和状态1 MySQL 架构和性能优化1.1 服务器配置和状态1.1.1 服务器选项

使用Java解析JSON数据并提取特定字段的实现步骤(以提取mailNo为例)

《使用Java解析JSON数据并提取特定字段的实现步骤(以提取mailNo为例)》在现代软件开发中,处理JSON数据是一项非常常见的任务,无论是从API接口获取数据,还是将数据存储为JSON格式,解析... 目录1. 背景介绍1.1 jsON简介1.2 实际案例2. 准备工作2.1 环境搭建2.1.1 添加

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