租车信息系统数据库设计(3)
2010-11-25 22:46 知行思新 阅读(4380) 评论(8) 编辑 收藏 举报前篇回顾
在租车信息系统数据库设计(1)与租车信息系统数据库设计(2)中我们列出了租车信息系统的12条需求,并相应做了数据库设计,最后得到的表关系图如下:
在租车信息系统数据库设计(2)的最后提出了3个新问题:
1. 出入库管理还能丰富,车辆买入,车辆报废,送修,还有不同门店之间的车辆拆借(如门店A向门店B临时借用某辆车),如何更好的记录这些StoreTransaction信息?
2. 顾客对于租车费用的支付信息如何记录,顾客可以通过预先充值后消费的方式来支付(这也是区分会员级别的关键),又该如何支持?
3. 我们在第一篇中暂时没考虑“送车上门和上门取车”服务,要支持这一功能,我们对数据库结构要做些什么改动?
就这3个问题,今天我给出自己的解决方案与大家进行讨论。
更细致的出入库管理
对于问题1,可以通过细分StoreTransaction来解决。
- 在Table_StoreTransaction表中增加StoreTransaction_Type列来存放进出库类型,我把进出库类型分为3种(Purchase,Adjustment,Rental)。相应还需要加入两张表Table_Purchase(记录买入车辆的信息),Table_Adjustment(记录车辆拆借、送修、报废信息)。
- Table_StoreTransaction表中的StoreTransaction_ReferenceID列根据不同的进出库类型指向不同表中的记录。
下表罗列了各种情况的进出库类型和Reference ID指向的表:
进出库类型 | Reference ID指向的表记录 | |
车辆出租 | Rental(In/Out) | Table_Order |
车辆买入 | Purchase(In) | Table_Purchase |
车辆拆借 | Adjustment(In/Out) | Table_Adjustment |
车辆送修 | Adjustment(In/Out) | Table_Adjustment |
车辆报废 | Adjustment(Out) | Table_Adjustment |
我们来看一下需要新建的表的字段。实际上,除了要新建Table_Purchase,Table_Adjustment之外,还会间接引入Table_AdjustmentType表。
- Table_Purchase:
列名 解释 Purchase_ID Identity字段 Store_ID 入库门店ID Car_VIN 车辆唯一编号 CarCategory_ID 车辆型号ID Purchase_Date 购买日期 Purchase_Price 购买价格 Purchase_Currency 货币 Purchase_CreatedBy 购车申请人 Purchase_AuthorisedBy 购车批准人 Purchase_Comment 购车备注 注意:
1. Table_Purchase表中没有Car_ID字段是因为在车辆买入之前,Table_Car中还没有对应记录。
2. 为了简化,我们的设计中Table_Purchase只记录成功购买车辆的信息。如果想对车辆购买进行像Order一样的流程控制,就需要增加些新的字段和表,如购车状态信息(记录Purchase的状态,如新建,审批通过,取消或完成等),大家自己根据需要添加。
- Table_Adjustment:
列名 解释 Adjustment_ID Identity字段 AdjustmentType_ID 调库类型ID,指向Table_AdjustmentType记录 Store_ID 入库/出库门店ID Car_ID 车辆ID Adjustment_Date 调库日期 Adjustment_ExpectDate 预期归还时间 Adjustment_CreatedBy 调库申请人 Adjustment_AuthorisedBy 调库批准人 Adjustment_Comment 调库备注 注意:
1. Adjustment_ExpectDate表示预期归还时间,此字段只有在Adjustment Type对应为Borrow In, Lend Out, Send to Repair中有意义。当为其他Adjustment Type时,此字段置为NULL。
2. 在此设计中,当某车辆从一个门店Adjust Out后,Table_Car中对应的车辆记录的车辆状态变为Inactive。当某车辆被Adjust In到一个门店后,Table_Car中会相应插入一条车辆记录(也有可能只需做Update),且该车辆状态为Ready。
3. 对于公司各门店之间的拆借,上述方式之外,大家也可以考虑把个门店也看作内部客户,一个门店可以向另一个门店创建Order,走Order流程。但借入车辆的门店需要有一种机制来把车辆收入门店,大家可以思考,并比较两种方式的优劣。
- Table_AdjustmentType:
列名 解释 AdjustmentType_ID Identity字段 AdjustmentType_Name 调库类型,包括:借入Borrow In,借出Lend Out,归还Return In,返还Return Out,送修Send to Repair,修完入库Return after Repair,报废Scrap AdjustmentType_InOutFlag 进出库标签 注意:
本设计中Adjustment Type分得较细,通过Adjustment Type就能区分是入库还是出库。
另一种设计是用较少的Adjustment Type来区分调库的种类(如只有Borrow,Return,Repair,Scrap四种),通过InOutFlag来区分进/出库。若要这么做就需要把InOutFlag字段放到Table_Adjustment中。至于两种方式的有缺点,大家可以思考。
新的表关系图
由于加入新的表之后,表关系链接出现了交错。所以我使用了数据库的‘自动整理表’功能把关系图重新排列了一下,得到下图:
- 其中用红色框圈出的表是这次新加入的表。
- 其中用黄色圈出的几个字段是我们需要注意的:
1. 在先前的Table_Car中(本文开始的关系图),有字段Car_PurchasePrice, Car_Currency。我们引入了Table_Purchase表之后,这两个字段的信息有冗余,可以省去。我把其中的Car_PurchasePrice改为了Car_CurrentPrice,用于记录每年折损后的车辆价值。
2. 在租车信息系统数据库设计(2)中,Table_StoreTransaction表中的StoreTransaction_ReferenceID字段对于车辆买入,车辆拆借、车辆报废和送修造成的出入库没有对应的信息。现在对于上述情况,此字段将引用Table_Purchase或Table_Adjustment的ID列。
下篇预告
没想到第一个问题就写了这么多,剩下的问题来不及写了,只能留到下一篇中讨论。
2. 顾客对于租车费用的支付信息如何记录,顾客可以通过预先充值后消费的方式来支付(这也是区分会员级别的关键),该如何支持?
3. 我们在第一篇中暂时没考虑“送车上门和上门取车”服务,要支持这一功能,我们对数据库结构要做些什么改动?