之前,学习编写机房收费系统的文档时,曾写过 机房收费系统数据库概念设计模型——ER图 这篇文章,现在到了机房收费系统个人版重构阶段,需要再次进行数据库的设计。可以说,之前的数据库的概念设计给我现在的设计奠定了一定的基础,但是仍然发现自己的设计中有许多不合理并且需要改进的地方。
在这次的数据库设计当中,学习了一些数据库的命名规范,重温了经典的三范式(属性原子化,避免局部依赖,避免传递依赖)。但是发现,在需求面前,一些分属两张表的字段,为了方便,还是得放到一张表中,不得不破坏三范式。
现在将自己设计的数据库分享如下:(因为自己还没真正进行机房的重构,不知道在实际应用中,这些表是否合理,还请大家提宝贵意见。
)
数据库名ComputerRoomChargeSystem
学生信息表(T_StudentInfo)
| 名称 |
意义 |
类型 |
| studentID |
学号(主键) |
Char(10) |
| studentName |
姓名 |
Char(10) |
| sex |
性别 |
Char(2) |
| department |
系别 |
Char(20) |
| grade |
年级 |
Char(10) |
| class |
班级 |
Char(10) |
这里,我将学生的信息和卡的信息分成两张表,首先,考虑到它们本身就属于不同的实体,其次,想到如果卡不用 了,就得把卡的信息删除,那么学生信息也得跟着删除(不过,后来想到,卡的信息可以不用删除,可通过标记其状态为“未使用”来区分)。最后,感觉把这么多字段放在一个表中,它看起来实在是太“臃肿”了。
用户信息表(T_UserInfo)
| 名称 |
意义 |
类型 |
| UserID |
用户名(主键) |
Char(10) |
| realName |
真实姓名 |
Char(10) |
| userLevel |
用户级别 |
Char(8) |
| userPassword |
用户密码 |
Char(10) |
| accountHolder |
开户人 |
Char(10) |
卡信息(T_CardInfo)
| 名称 |
意义 |
类型 |
| cardID |
卡号(主键) |
Char(10) |
| studentID |
学号(外键) |
Char(10) |
| account |
余额 |
Decimal(10,4) |
| usageState |
使用状态 |
Char(6) |
| cardType |
卡类型 |
Char(8) |
| registrationDate |
注册日期 |
Date |
| registrationTime |
注册时间 |
Time(0) |
| UserID |
用户名 |
Char(10) |
| checkStatus |
结账状态 |
Bit(1) |
这里,使用状态用来标记该卡是使用,还是未使用(已退卡)。卡类型来标记是固定用户还是临时用户。
账单(T_AccountSheet)
| 名称 |
意义 |
类型 |
| checkID |
结账编号(主键) |
Decimal(18,0) |
| lastCardMoney |
上期充值卡金额 |
Decimal(18,4) |
| currentChargeMoney |
本期充值金额 |
Decimal(18,4) |
| currentReturnMoney |
本期退卡金额 |
Decimal(18,4) |
| currentConsumeMoney |
本期消费金额 |
Decimal(18,4) |
| currentCardMoney |
本期充值卡金额 |
Decimal(18,4) |
| checkDate |
结账日期 |
Date |
| checkTime |
结账时间 |
Time(0) |
| userID |
用户名 |
Char(10) |
账单,我为其设置了一个结账编号,作为主键,我想在真正建表时,可以按照结账编号从大到小排列,因为在打印账单或是日结账, 周结账都是结最近的账单吧。
本期充值卡金额=上期充值卡金额+本期充值金额-本期消费金额-本期退卡金额
充值记录表(T_ChargeRecord)
| 名称 |
意义 |
类型 |
| cardID |
卡号(外键) |
Char(10) |
| chargeDate |
充值日期 |
Date |
| chargeTime |
充值时间 |
Time(0) |
| chargeMoney |
充值金额 |
Decimal(10,4) |
| checkStatus |
结账状态 |
Bit(1) |
| userID |
用户名 |
Char(10) |
退卡记录表(T_ReturnRecord)
| 名称 |
意义 |
类型 |
| cardID |
卡号(外键) |
Char(10) |
| returnDate |
退卡日期 |
Date |
| returnTime |
退卡时间 |
Time(0) |
| account |
退卡金额 |
Decimal(10,4) |
| checkStatus |
结账状态 |
Bit(1) |
| userID |
用户名 |
Char(10) |
上下机记录表(T_OnOffLineRecord)
| 名称 |
意义 |
类型 |
| cardID |
卡号(外键) |
Char(10) |
| onDate |
上机日期 |
Date |
| onTime |
上机时间 |
Time(0) |
| offDate |
下机日期 |
Date |
| offTime |
下机时间 |
Time(0) |
| offWay |
下机方式 |
Char(8) |
| consumeMoney |
消费金额 |
Decimal(10,4) |
| userID |
用户名 |
Char(10) |
| checkStatus |
结账状态 |
Char(6) |
| onFlag |
正在上机标志 |
Bit(1) |
在这个表中,我增加了结账状态这个字段,因为想到结账时,除了会结购卡数,充值金额,退卡金额,还要结消费金额。
基本数据表(T_BasicData)
| 名称 |
意义 |
类型 |
| fixedPerCharge |
固定每小时费用 |
Decimal(10,4) |
| temporaryPerCharge |
临时每小时费用 |
Decimal(10,4) |
| increasingUnitTime |
递增单位时间 |
SmallInt |
| leastTime |
至少上机时间 |
SmallInt |
| prepareTime |
准备时间 |
SmallInt |
| minMoney |
最少金额 |
Decimal(10,4) |
操作员工作记录(T_WorkLog)
| 名称 |
意义 |
类型 |
| UserID |
用户名(外键) |
Char(10) |
| LoginDate |
登录日期 |
Date |
| LoginTime |
登录时间 |
Time(0) |
| ExitDate |
注销日期 |
Date |
| ExitTime |
注销时间 |
Time(0) |
| onFlag |
正在上机标志 |
Bit(1) |
| computerID |
机器名 |
Varchar(10) |
小结:自己感觉数据库设计是件很有意思的事情,在画机房重构版的类图时,感觉还得先从数据库设计入手,所以数据库设计还是很重要的啊!