一开始参考了第一次的经验,画出了一个ER图,在现有的数据库的基础上做了两处改动,一是将日结账和周结账表合成一个账单表,因为这两个表的字段是一样的,查询日账单和周账单可以通过日期这个字段筛选得到。二是将原来的学生表拆分成了学生表和卡表。
画是画出来了,但是涉及到了11个表,表的数量合并了一个,又拆分了一个,不增不减。在全局ER模型优化这一步骤需要注意一点就是要消除冗余属性,即在工作表中有用户ID、登录日期、登录时间、机器号这些属性,在工作记录表中全部包含了这几个属性。在线表里的属性和上机记录表里的属性也是重复了,导致了在全局范围内的冗余属性,冗余属性应予消除。第二版ER图出炉~~~
在设计数据库时好几个表都需要记录日期和时间,在上图中也看的出来,一直有疑惑为什么要把日期和时间分开写,也没有深想,猜测可能是方便查询吧。但再后来跟同学交流期间了解到好像VS里是没有Time这个类型的,到后来转换起来也是个问题,相反的,把日期和时间结合起来更方便查询,于是又将ER图做了一番调整。第三版出炉~~~
基本数据设定表 |
BasicData |
退卡表 |
CancelCard |
账单表 |
Check_Info |
卡表 |
Card |
上机记录表 |
LineLog |
充值表 |
Recharge |
学生表 |
Student |
用户表 |
User_Info |
工作记录表 |
WorkLog |
用户表:(UserID,PWD,Level,UserName,state)
学生表:(studentNo,cardNo,studentName,sex,department,grade,specialty)
卡表:(cardNo,studentNo,Balance,state,regdate,Ischeck)
基础数据表:(serial,Rate,UnitTime,LeastTime,ReadyTime,LeastCash,head)
上机记录表:(serial,cardNo,computer,onDate,offDate,mins,cash)
工作记录表:(serial,UserID,LoginDate,LogoutDate,computer,state)
充值记录表:(serial,cardNo,RechCash,Balance,RechDate,UserID,computer)
退卡表:(serial,cardNo,CancelCash,CancelDate,UserID,computer)
账单:(serial,CheckCash,RechCash,CancelCash,RemainCash,CheckDate,head)
1)用户表(User_Info)
描述 |
字段名 |
数据类型 |
长度 |
是否Null |
用户ID |
UserID |
varchar |
20 |
否 |
密码 |
PWD |
varchar |
20 |
否 |
验证等级 |
Level |
varchar |
20 |
否 |
用户名 |
UserName |
varchar |
20 |
否 |
状态 |
state |
bit |
1 |
否 |
2)学生表(Student)
描述 |
字段名 |
数据类型 |
长度 |
是否Null |
学号 |
studentNo |
varchar |
20 |
否 |
卡号 |
cardNo |
varchar |
20 |
否 |
姓名 |
studentName |
varchar |
20 |
否 |
性别 |
sex |
bit |
1 |
否 |
学院 |
department |
varchar |
20 |
否 |
年级 |
grade |
char |
6 |
否 |
专业 |
specialty |
varchar |
20 |
否 |
3)卡表(Card)
描述 |
字段名 |
数据类型 |
长度 |
小数 |
是否Null |
卡号 |
cardNo |
varchar |
20 |
|
否 |
学号 |
studentNo |
varchar |
20 |
|
否 |
余额 |
Balance |
numeric |
10 |
2 |
|
操作员 |
UserID | varchar | 20 | 否 | |
状态 |
state |
bit |
1 |
|
否 |
注册时间 |
regdate |
smalldatetime |
|
|
否 |
是否结账 |
Ischeck |
bit |
1 |
|
否 |
4)基础数据表(BasicData)
描述 |
字段名 |
数据类型 |
长度 |
小数 |
是否Null |
设定时间 |
serial |
smalldatetime |
|
|
否 |
单位费用 |
Rate |
numeric |
10 |
2 |
否 |
|
|||||
单位时间 |
UnitTime |
int |
|
|
否 |
至少上机时间 |
LeastTime |
int |
|
|
否 |
准备时间 |
ReadyTime |
int |
|
|
否 |
最小金额 |
LeastCash |
numeric |
5 |
2 |
否 |
管理员 |
head |
varchar |
20 |
|
否 |
5)上机记录(LineLog)
描述 |
字段名 |
数据类型 |
长度 |
小数 |
是否Null |
流水号 |
serial |
int |
|
|
否 |
卡号 |
cardNo |
varchar |
20 |
|
否 |
机器号 |
computer |
varchar |
20 |
|
否 |
上机日期 |
onDate |
smallDatetime |
|
|
否 |
下机日期 |
offDate |
smallDatetime |
|
|
是 |
上机总时长 |
mins |
int |
|
|
是 |
消费金额 |
cash |
numeric |
10 |
2 |
|
6)工作记录表(WorkLog)
描述 |
字段名 |
数据类型 |
长度 |
是否Null |
流水号 |
serial |
int |
|
否 |
用户ID |
UserID |
varchar |
20 |
否 |
登录日期 |
LoginDate |
smalldatetime |
|
否 |
注销日期 |
LogoutDate |
smalldatetime |
|
是 |
机器号 |
computer |
varchar |
20 |
否 |
状态 |
state |
bit |
1 |
否 |
7)充值表(ReCharge)
描述 |
字段号 |
数据类型 |
长度 |
小数 |
是否Null |
流水号 |
serial |
int |
|
|
否 |
卡号 |
cardNo |
varchar |
20 |
|
否 |
充值金额 |
RechCash |
numeric |
10 |
2 |
否 |
当前余额 |
Balance |
numeric |
10 |
2 |
否 |
充值时间 |
RechDate |
smalldatetime |
|
|
否 |
操作员 |
UserID |
time |
|
|
否 |
机器号 |
computer |
varchar |
20 |
|
否 |
8)退卡表(CancelCard)
描述 |
字段名 |
数据类型 |
长度 |
小数 |
是否Null |
流水号 |
serial |
int |
|
|
否 |
卡号 |
cardNo |
varchar |
20 |
|
否 |
退卡金额 |
CancelCash |
numeric |
10 |
2 |
否 |
退卡日期 |
CancelDate |
smalldatetime |
|
|
否 |
操作员 |
UserID |
varchar |
20 |
|
否 |
机器号 |
computer |
varchar |
20 |
|
否 |
9)账单(Check_Info)
描述 |
字段名 |
数据类型 |
长度 |
小数 |
是否Null |
账单编号 |
serial |
int |
|
|
否 |
结账金额 |
CheckCash |
numeric |
10 |
2 |
否 |
充值金额 |
RechCash |
numeric |
10 |
2 |
否 |
退卡金额 |
CancelCash |
numeric |
10 |
2 |
否 |
上次结余 |
RemainCash |
numeric |
10 |
2 |
否 |
结账日期 |
CheckDate |
smalldatetime |
|
|
否 |
结账人 |
head |
varchar |
20 |
|
否 |
这次重构比起上次来要清晰很多,学的时间越久越会发现反反复复就是这些东西,其实这也是生活,太阳总是日出而升日落而降,只是这其中的过程可以千姿百态,找不到方向时,停下了好好想想,然后选择最顺手的去走就好了。