我正面临着一个设计酒店网站预订系统的问题,该系统可以处理成千上万个酒店房间及其可用性。诸如Expedia网站之类的东西。
此可用性将需要存储在本地,并且我需要查询这些酒店房间的可用性。
到目前为止,我已经达到以下结构:
room_type的划分,这是其特征的组合,例如,如果有视图,或房间中的人数最多,例如:with view / 3人将是一个类型,其他类型将是:with view / 4人,无景观2人,有景观4人,等等。\
每个房间都将被分配给room_type,以便在前端进行演示。例如:我不会显示个人房间记录(例如:201房间),但是我会显示我有该类型的房间。
因此,我将有一个房间“表”和一个room_type“表”,每个房间都有一个类型。
然后是从今天到未来六个月的房间(行)和日期(列)的矩阵。
矩阵如下所示:
其中1表示该日期有空房间,0表示已预订。因此,要让我检测在某个日期范围内是否有room_type可用,我必须:
对于这种类型的每个房间;
扫描所需日期之间的所有列;
如果在该行中没有找到0的房间,则表示该房间可用,因此这表示该room_type在该日期范围内可以显示为可用。
在上表中,假设日期范围是10/10/2017至10/14/2017(美国格式),唯一可用的房间是C酒店的101房间。
然后,我可以将客户预订到该房间,这样客户就不必在他/她逗留期间更改房间。
我的问题是:
有没有可以在内存中容纳像这样的大型矩阵的存储设备? (MySQL,Redis,PostgreSQL,Cassandra,MongoDB等)
如果我应该使用RDBMS,那是什么类型?我应该使用传统的RDBMS吗?或者,这种“类似矩阵的结构”会更好地适合另一种新型NoSQL数据库。
这些巨大的访问量很大的网站是这种“矩阵状结构”吗? (例如:Expedia,Booking.com,Trivago等)还是有更好的方法来更快地查询日期范围?
我担心现在选择的结构不正确,将来在网站需求量大且房间数量更多时会遇到性能问题。
谢谢。
最佳答案
首先,谢谢你的提问。考虑到除了基本的酒店供应情况之外的各种用例,这是我所知道的复杂问题之一。例如:如何进行地理搜索,如何在同一天支持同一房间的多个登机手续,如何使数据与世界观高度一致(最新价格和可用性) ,如何根据价格对酒店进行排名,如何添加更多属性(例如自定义优惠(无烟,24小时入住,包括厨房等),如何处理不同的取消政策等)。
我相信,您明白了。
我遇到的最好的设计使用无列或无模式的存储(如cassandra,mongo)以及RDBMS。
NoSQL存储提供了灵活性,可以继续添加更多属性,还可以跨多个维度进行搜索,例如城市,附近搜索等。
RDBMS可以存储很少更改的数据,例如不同的房间类型,酒店描述等。
例如,对于上面的简单用例,我将所有不同的房间类型(酒店到房间的映射)存储在RDBMS中。但是酒店价格和空房情况将归NoSQL商店所有。我会将房间价格和空房情况存储在NoSQL商店中,并将搜索属性(如入住/退房日期,人数,房间数量)作为此表的键。我将定期运行一个cron作业,以填充所有可用房间的所有不同搜索排列(通过在另一个预订表上的交叉查找)并更新NoSQL存储。这样,读取路径就更快了(这与许多社交媒体网站设计其架构的写时扇出方法非常相似。优化读取路径并在写入路径上传播更新,完全意识到可以将读取数据有点陈旧)。在我们的案例中,在cron作业运行之间的时间段内,价格和可用性可能过时,但是可以通过在预定时间之前用一致的商店(例如预订表)进行另一次检查来轻松抵消这笔费用。如果存在差异,则可以再次启动工作流程。
注意:以上内容是高度主观的看法,并基于价格和可用性很少变化的假设。您可以结合使用流式系统(例如kafka)来加快更新速度
关于database-design - 设计高性能的酒店客房预订系统,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49396360/