我已经开发了一个系统,用于使用php和mysql为一家拥有150家左右酒店的旅行社管理酒店价格,分配和预订。
由于酒店房价因日期表而异,大致设计如下
hotel_tbl{
hotel_id,
hotel_name
}
room_type_tbl{
room_type_id,
room_type_name,
hotel_id
}
room_rates_tbl{
room_type_id,
**from_date,
**till_date,
meal_basis,//(Breakfast,halfboard,fullboard) BB,HB,FB
sleeps,//(Single,Double,Triple) SGL,DBL,TPL
currency,
room_rate
}
由于酒店价格会随着日期的变化而波动,我在查询表格中进行复杂的旅游套餐计算(涉及多个酒店)时注意到,其性能低于预期。我的问题是,如果我为每个日期设置一个费率行而不使用日期范围(我的系统包含大约150家酒店),您的性能会有所改善吗?如下所示:
room_rates_tbl { // A row for each day as opposed to using a date range
room_type_id,
**date,
meal_basis,//(Breakfast,halfboard,fullboard) BB,HB,FB
sleeps,//(Single,Double,Triple) SGL,DBL,TPL
currency,
room_rate}
希望问题足够清楚...
我已经更新了我的问题,使其更加清晰。房间类型例如是“标准间”或“豪华间”或“家庭间”,“睡眠”将包含其单人,双人等。我从问题中删除了market_type,因为它与市场组无关(例如国家/地区),税率会降低。我的问题是,在查询费率表时,存储日期费率比使用日期范围更有效。
最佳答案
假设您的查询是针对两个给定日期之间所有酒店的特定房型。您需要从数据库中获得什么?我会建议:
开始日期所有酒店的那种房型价格
截止日期所有酒店的此类房费
您希望避免进行表扫描,因为这会减慢您对用户的响应。因此,任何查找都需要使用索引。由于查询基于日期,因此应该对日期字段建立索引。因此,如果用户想要在12年12月31日至13年5月1日之间的房间,我们可以对索引使用范围运算符,如http://dev.mysql.com/doc/refman/5.1/en/range-optimization.html#range-access-single-part中所述)。 (如果将日期值存储为时间戳记值,则会减小值的存储大小,这将改善索引的性能。)如果使用原始表架构,则将需要两个索引-一个在开始日期还有一个截止日期-与建议的经修改的表相比,表中的行较少,它将需要一个索引但需要更多的表行(每天等一行,等等)。变量太大以至于不能建议哪个表的性能更好。