ER图设计
一开始参考了第一次的经验,画出了一个ER图,在现有的数据库的基础上做了两处改动,一是将日结账和周结账表合成一个账单表,因为这两个表的字段是一样的,查询日账单和周账单可以通过日期这个字段筛选得到。二是将原来的学生表拆分成了学生表和卡表。
画是画出来了,但是涉及到了11个表,表的数量合并了一个,又拆分了一个,不增不减。在全局ER模型优化这一步骤需要注意一点就是要消除冗余属性,即在工作表中有用户ID、登录日期、登录时间、机器号这些属性,在工作记录表中全部包含了这几个属性。在线表里的属性和上机记录表里的属性也是重复了,导致了在全局范围内的冗余属性,冗余属性应予消除。第二版ER图出炉~~~
在设计数据库时好几个表都需要记录日期和时间,在上图中也看的出来,一直有疑惑为什么要把日期和时间分开写,也没有深想,猜测可能是方便查询吧。但再后来跟同学交流期间了解到好像VS里是没有Time这个类型的,到后来转换起来也是个问题,相反的,把日期和时间结合起来更方便查询,于是又将ER图做了一番调整。第三版出炉~~~
最终确定了9个表:
基本数据设定表 | 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 |
| 否 |
结语
这次重构比起上次来要清晰很多,学的时间越久越会发现反反复复就是这些东西,其实这也是生活,太阳总是日出而升日落而降,只是这其中的过程可以千姿百态,找不到方向时,停下了好好想想,然后选择最顺手的去走就好了。