我已经开发了一个系统,用于使用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中所述)。 (如果将日期值存储为时间戳记值,则会减小值的存储大小,这将改善索引的性能。)如果使用原始表架构,则将需要两个索引-一个在开始日期还有一个截止日期-与建议的经修改的表相比,表中的行较少,它将需要一个索引但需要更多的表行(每天等一行,等等)。变量太大以至于不能建议哪个表的性能更好。

10-06 05:38