假设停车场有以下时间和相关费用......
Mon-Fri 7am - 5pm parking is $5/2hrs
Mon-Fri 5pm - 7am parking is $1/hr
Sat and Sun - 12am - 12pm parking is free
Run Code Online (Sandbox Code Playgroud)
您将如何对这些数据进行建模,以便我可以提出诸如“停车场 A 现在的成本是多少?”之类的问题。
我目前不确定,但似乎模型应该在一天中的某些时间容纳多个价格。例如...
Mon-Fri 7am - 5pm parking is $5/2hrs or $7/3hrs
Run Code Online (Sandbox Code Playgroud)
例如,如果很多成本发生变化,它也应该很容易修改。
这是我到目前为止的一般想法......
ParkingLot -
ParkingLotId
Name
Address
ParkingLotSchedule -
ParkingLotId
DayOfTheWeek
StartTime
EndTime
Cost
Run Code Online (Sandbox Code Playgroud)
然后我基本上可以编写一个查询,例如......
select cost from parkingLotSchedule where parkingLotId = currentLotId and dayOfTheWeek = today and currentTime between startTime and endTime
Run Code Online (Sandbox Code Playgroud)
这并没有真正考虑到某些时间出现多个价格的可能性(当然我还不是 100% 确定这是必要的)。似乎一个批次可能有很多记录。
有一个更好的方法吗?如果是这样,模型会是什么样子?
根据您经营的停车场数量,我不会太担心您必须管理多少记录。这些数据不会快速变化,因为您可能需要打印标有价格等的标志。尽管如此,假设您有很多批次(其中许多具有相同的定价)并且您希望最大限度地减少数据维护,您可以构建一个价格表并将批次映射到该时间表。
考虑这样的事情:
ParkingLot -
ParkingLotId
Name
Address
PriceSchedule -
PriceScheduleId
Description
PriceScheduleDetail -
PriceScheduleDetailId
PriceScheduleId
DayOfTheWeek
StartTime
EndTime
DollarsPerUnit
MinutesPerUnit
MinutesMinimumStay
ParkingLotPrice -
ParkingLotId
PriceScheduleId
EffectiveDate
ExpiryDate
Run Code Online (Sandbox Code Playgroud)
请注意,该PriceScheduleDetail
表允许您在一天中的给定时间范围内保留价格的两个或多个版本。
另请注意,该ParkingLotPrice
表使用有效日期和到期日期将停车场按日期范围链接到价格表。这允许您提前设置价格变化,这样您就无需在价格变化生效时的半夜加载新数据。
您的定价查询将不得不根据最短停留时间找到适用的价格版本,这比“现在的价格是多少?”要复杂得多。因为这将取决于停留多长时间以及客户有资格获得的最优惠价格。此外,客户支付的价格将取决于他们逗留的时间长短,并且可能跨越一个或多个价格点界限。