租车信息系统数据库设计(3)

前篇回顾

租车信息系统数据库设计(1)租车信息系统数据库设计(2)中我们列出了租车信息系统的12条需求,并相应做了数据库设计,最后得到的表关系图如下:

CarRentalDiagram3_1

租车信息系统数据库设计(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中。至于两种方式的有缺点,大家可以思考。

新的表关系图

由于加入新的表之后,表关系链接出现了交错。所以我使用了数据库的‘自动整理表’功能把关系图重新排列了一下,得到下图:

CarRentalDiagram3_2

  • 其中用红色框圈出的表是这次新加入的表。
  • 其中用黄色圈出的几个字段是我们需要注意的:

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. 我们在第一篇中暂时没考虑“送车上门和上门取车”服务,要支持这一功能,我们对数据库结构要做些什么改动?

原文地址:https://www.cnblogs.com/DBFocus/p/1888209.html