我正面临设计酒店网站预订系统的情况,该系统可能处理成千上万的酒店房间及其可用性。像Expedia网站那样的东西。
此可用性需要存储在本地,我需要查询这些酒店房间的可用性。
到目前为止,我已经达到了以下结构:
其中1表示该日期有空房,0表示已预订。因此,我要检测一个room_type是否在日期范围内可用,我必须:
在上表中,假设日期范围是10月1日至2017年10月14日(美国格式),唯一可用的房间将是C酒店的101室。
然后,我可以将客户预订到该房间,因此客户在他/她的住宿期间无需更换房间。
我的问题是:
我担心现在没有选择正确的结构,并且在网站需求量很大且房间数量更多的情况下,以后会遇到性能问题。
谢谢。
答案 0 :(得分:1)
首先,感谢您提出的问题。这是我所知道的复杂问题之一,考虑到基本酒店可用性之外的各种用例。一些示例:您如何进行地理搜索,如何在同一天支持同一房间的多次签到,如何使数据与世界视图保持高度一致(最新价格和可用性) ,您如何根据价格对酒店进行排名,如何添加更多属性,如自定义福利(无烟,24小时入住,包括厨房等),如何处理不同的取消政策等。
你明白了,我相信。
我遇到的最佳设计使用了列或无模式存储(如cassandra,mongo)以及RDBMS。
NoSQL商店可以灵活地添加更多属性,还可以搜索城市,附近搜索等多个维度。
RDBMS可以存储很少变化的数据,如不同的房间类型,酒店描述等。
例如,对于上面的简单用例,我会在RDBMS中存储所有不同的房间类型,酒店到房间的映射。但酒店价格和可用性将转到NoSQL商店。我会将房价和可用性存储在NoSQL商店中,其搜索属性包括签入/签出日期,人数,房间数作为此表的关键字。我会定期运行一个cron作业来填充所有可用房间的所有不同搜索排列(通过在另一个预订表上交叉查找)并更新NoSQL商店。通过这种方式,读取路径更快(这与许多社交媒体网站设计其架构的写入方法非常类似。优化读取路径并在写入路径上传播更新,完全意识到读取数据可以是有点陈旧)。在我们的案例中,价格和可用性可能在cron作业运行之间的时间段内是陈旧的,但是这可以通过在预订时间之前使用一致的商店(例如预订表)进行另一次检查来轻松抵消。如果存在差异,您可以再次启动工作流程。
注意:以上是一个非常主观的意见,并基于价格和可用性不经常变化的假设。您可以使用像kafka这样的流媒体系统组合来加快更新速度