前篇回顾
租车信息系统数据库设计(1)中我们根据租车系统最基本的一些需求,设计出了如下表结构:
- 有朋友看了这个结构图后问我为什么对于订单没有设计成主从表(即分为OrderHeader,OrderDetail)。
订单的主从表设计在ERP系统中非常常见,在OrderHeader中存放客户信息,在OrderDetail中存放此客户本次订购的多种产品(每种产品若干数量),这种设计也更符合范式。我当初在进行设计时,首先想到的也是主从表设计,但思考了租车的需求场景,我最后选择了现在的这一设计。在我的电影院票务管理系统数据库设计(2)中对于类似问题进行过详细的分析,所以这里不再展开。但现在的结构也未必是最符合实际需求的,毕竟我是闭门造车,大家可自己思考提出更合理的设计方案。
- Order状态问题
在上一篇中我们设计了6种Order状态,分别是:输入Entered,提交Booked,预约Reserved,使用中Inuse,交还Returned,取消Cancelled。对于正常Order的结束状态为Returned,但我在和曾经租过车的同事闲聊后,我觉得需要再加一个Closed状态作为Order结束状态。一般顾客在还车后,租车公司还会收取约600元的预授权,租车公司会检查该车在租用期是否有违章罚款,如若没有,这笔费用将在约两个月后打回顾客卡内。只有到这个时候这个Order才真正结束了(预授权的600元也需要记录在Table_Order表中,大家可以自行加一些列,本文为简化不列出了)。
进一步的分析与设计
第一篇中的设计不能满足现实需求的重要一点是,系统中没有记录顾客实际取车和还车的时间,这对于计算实际费用是至关重要的。当前的设计也无法回答门店库存车辆的变化情况。还有像车辆的维修信息,保险信息也都没有记录在系统中。
我们把这些新的需求进行整理,接在第一篇的需求列表之后:
8. 需记录顾客实际取车和还车的时间,用于计算实际的租车费用。
9. 需记录门店库存车辆的变化情况,跟踪每一辆车的进出库信息。
10. 记录每辆车的维修历史,包括维修的时间,费用,维修公司,维修合同号。
11. 记录每辆车的保险历史,包括保险的时间,费用,保险公司,保险合同号。
12. 注册顾客会有多个等级,对于不同等级会给予不同的折扣率(如:黄金用户有95折的优惠)。
对于需求8,我们要在原先的Table_Order中加入新的列,加入Order_ActualStartDate,Order_ActualEndDate来记录实际取车和还车时间,还要加入Order_ActualPrice来记录实际产生的租车费用。
对于需求9,我们可以加入一张Table_StoreTransaction表来记录车辆的进出库流水。表中的字段需包括:发生进出库的车辆ID(Car_ID),表示是进库还是出库的标签(StoreTransaction_InOutFlag),进出库的时间(StoreTransaction_Date)。Table_Car与Table_StoreTransaction为一对多关系。
对于需求10,我们要加入一张Table_RepairHistory表,Table_Car与Table_RepairHistory为一对多关系。间接的还会引入一张Table_RepairStation表,来记录维修点信息。Table_RepairStation与Table_RepairHistory之间也为一对多关系。
对于需求11,加入一张Table_InsuranceHistory表,Table_Car与Table_InsuranceHistory为一对多关系。间接引入Table_InsuranceCompany表,记录保险公司信息。Table_InsuranceCompany与Table_InsuranceHistory之间为一对多关系。
对于需求12,加入Table_Class表,表中会存放折扣信息(Class_Discount)。Table_Class与Table_Customer之间为一对多关系。
新的表关系图如下:
上图中用红色框标出了本次增加或改变的表和字段。
其中需要注意的是Table_StoreTransaction表中用黄色框标出的StoreTransaction_ReferenceID字段。这个字段存放某次出入库对应的Order_ID,这样就能知道StoreTransaction与Order的对应关系了。但对于车辆买入,或车辆报废,送修造成的出入库,这一字段暂时还没有对应的数据,这将在下一篇中讨论。
下篇预告
到现在为止租车系统的基本需求已经满足了,但还有不少问题值得思考。
1. 出入库管理还能丰富,车辆买入,车辆报废,送修,还有不同门店之间的车辆拆借(如门店A向门店B临时借用某辆车),如何更好的记录这些StoreTransaction信息?
2. 顾客对于租车费用的支付信息如何记录,顾客可以通过预先充值后消费的方式来支付(这也是区分会员级别的关键),又该如何支持?
3. 我们在第一篇中暂时没考虑“送车上门和上门取车”服务,要支持这一功能,我们对数据库结构要做些什么改动?