Database design 设计一个高性能的酒店客房预订系统
我正面临着一个设计一个酒店网站预订系统的情况,该系统可以处理成千上万的酒店房间及其可用性。比如Expedia网站 这种可用性需要存储在本地,我需要查询这些酒店房间的可用性 到目前为止,我的结构如下:Database design 设计一个高性能的酒店客房预订系统,database-design,architecture,nosql,scalability,database-performance,Database Design,Architecture,Nosql,Scalability,Database Performance,我正面临着一个设计一个酒店网站预订系统的情况,该系统可以处理成千上万的酒店房间及其可用性。比如Expedia网站 这种可用性需要存储在本地,我需要查询这些酒店房间的可用性 到目前为止,我的结构如下: 房间类型的一种划分,可以是其特征的组合,例如,如果房间有视图,或者房间中的人数最多,例如:有视图/3人将是单独的类型,其他类型将是:有视图/4人,无视图2人,有视图/4人,等等\ 每个房间将被分配到一个房间类型,以便在前端进行演示。例如:我不会显示单独的房间记录(例如:201房间),但我会显示我有
- 房间类型的一种划分,可以是其特征的组合,例如,如果房间有视图,或者房间中的人数最多,例如:有视图/3人将是单独的类型,其他类型将是:有视图/4人,无视图2人,有视图/4人,等等\
- 每个房间将被分配到一个房间类型,以便在前端进行演示。例如:我不会显示单独的房间记录(例如:201房间),但我会显示我有该类型的可用房间
- 所以我会有一个房间“桌子”和一个房间类型“桌子”,每个房间都有一个类型
- 然后是从今天到未来6个月的房间(行)和日期(列)矩阵
- 有没有任何存储器可以在内存中保存这样一个大矩阵?(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等流媒体系统的组合来加快更新速度为什么您会假设酒店可用性很少变化?在预订系统中,这不是最频繁的吗改变什么?除非实际上没有人在使用系统和预订。对于为什么选择在数据库中存储不符合ACID的预订信息,您也非常困惑。