【问题标题】:Online travel agent database design (rates table) for hotels in mysqlmysql中酒店的在线旅行社数据库设计(价格表)
【发布时间】:2012-05-16 07:51:16
【问题描述】:

我为一家拥有大约 150 家酒店的旅行社开发了一个使用 php 和 mysql 管理酒店价格、分配和预订的系统。 由于酒店房价因日期而异,表设计大致如下

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,因为它与市场组无关(例如国家)的费率是 targarted。我的问题是在查询费率表时,存储日期费率是否比使用日期范围更有效。

【问题讨论】:

  • 在更改数据结构之前,首先确保您对用于查找的每一列都有索引并且它们被正确使用(检查EXPLAIN 查询的输出)。
  • @eggyal 谢谢,我将在列中添加索引,如何在查询输出中使用 EXPLAIN?
  • 在你的查询前加上 EXPLAIN 这个词,让 MySQL 向你展示它的执行计划。
  • @ChrisWalton 我已经更新了我的问题以使其更清楚。房间类型例如是“标准房”或“豪华房”或“家庭房”,睡眠将包含单人房、双人房等。我已从问题中删除了 market_type,因为它与市场组无关(例如国家/地区)费率的目标是。我的问题是在查询费率表时,存储日期费率是否比使用日期范围更有效。
  • @eggyal 谢谢你,我会试着解释一下..

标签: php mysql


【解决方案1】:

假设您的查询是针对两个给定日期之间所有酒店的特定类型的房间。您需要从数据库中获取什么?我建议:

  1. 开始日期所有酒店该类型客房的价格
  2. 截至结束日期所有酒店该类型客房的房价

您希望避免表扫描,因为这些会减慢您对用户的响应速度。所以任何查找都需要使用索引。由于查询是基于日期的,因此应该对日期字段进行索引。因此,如果用户想要一个介于 31/12/12 和 05/01/13 之间的房间,我们可以在索引上使用范围运算符,如 http://dev.mysql.com/doc/refman/5.1/en/range-optimization.html#range-access-single-part 中所述。 (如果将日期值存储为时间戳值,则会减少值的存储大小,这应该会提高索引的性能。)如果使用原始表模式,则需要两个索引 - 一个在开始日期还有一个在结束日期 - 但与您建议的修改后的表格相比,表格中的行更少,这将需要一个索引,但需要更多的表格行(每天一个等)。建议哪一个表现更好,这太可变了。

【讨论】:

  • 非常感谢您的回答我将在索引列上查看有关范围运算符的文章,也尝试以时间戳格式而不是日期格式存储。我想我必须使用这两种模式进行一些测试。如果我在 SELECT 语句中使用关键字 EXPLAIN,它还会返回检索所用的时间吗?
【解决方案2】:

我认为最好将您的日期和费率分开到另一个表中。

room_tbl - room_id、room_type_id、market_type_id 以及任何房间信息

room_rate_tbl - room_id,from_date,till_date,货币,room_rate

通过这种方式,您的房间信息是独立的,您可以轻松地将任何房价添加、编辑、删除到特定的 room_id。

【讨论】:

  • 感谢您的回答,表格已经标准化,房价基于 room_types 而不是单个房间。我的问题是,将每一天的费率存储在单独的行中而不是使用日期范围是否会更有效(用于查询)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多