Database 物业预订日历的最佳实践数据库架构

Database 物业预订日历的最佳实践数据库架构,database,database-design,schema,Database,Database Design,Schema,我正在开发一个多属性预订系统,这让我对最佳实践模式设计感到头疼。例如,假设站点承载5000个属性,其中每个属性都由一个用户维护。每个酒店都有预订日历。我当前的实现是一个两表系统,一个表用于可用日期,另一个表用于不可用日期,每个表的粒度为1天 酒店日期可用(酒店id、日期) 财产登记日期(财产id、日期) 然而,我不确定这是否是一个好的解决方案。在另一个问题中,我读到了关于两种状态都表示的单表解决方案。但我不知道把它们混在一起是不是个好主意。此外,是否应将全年的预订日历及其所有365天映射到数据库

我正在开发一个多属性预订系统,这让我对最佳实践模式设计感到头疼。例如,假设站点承载5000个属性,其中每个属性都由一个用户维护。每个酒店都有预订日历。我当前的实现是一个两表系统,一个表用于可用日期,另一个表用于不可用日期,每个表的粒度为1天

酒店日期可用(酒店id、日期)

财产登记日期(财产id、日期)

然而,我不确定这是否是一个好的解决方案。在另一个问题中,我读到了关于两种状态都表示的单表解决方案。但我不知道把它们混在一起是不是个好主意。此外,是否应将全年的预订日历及其所有365天映射到数据库表中,还是最好只映射可预订酒店的天数?我想到了每年急剧增加的行数。此外,我想最近在数据库中搜索可用属性,但不确定与仅5000*av相比,查看5000*365行是否是个坏主意。100行


你一般会推荐什么?这方面是不可忽视的吗?如何最佳实践来实现这一点?

我不明白为什么您需要一个单独的表来显示可用日期。如果您有一个预订日期表(property_id,date),那么您可以轻松地查询该表,以了解在给定日期哪些属性可用

select properties.property_name
from properties where not exists
(select 1 from property_dates_booked
 where properties.property_id = property_dates_booked
 and property_dates_booked.date = :date)
:日期是查询的参数


仅在属性“日期”表中输入实际预订(将该表重命名为“预订”会更容易)。如果某个物业因维护而在某些日期不可用,则在客户“特殊”的日期(可能“客户”的id为负数)输入预订

我不明白你为什么需要一个单独的表来显示可用日期。如果您有一个预订日期表(property_id,date),那么您可以轻松地查询该表,以了解在给定日期哪些属性可用

select properties.property_name
from properties where not exists
(select 1 from property_dates_booked
 where properties.property_id = property_dates_booked
 and property_dates_booked.date = :date)
:日期是查询的参数


仅在属性“日期”表中输入实际预订(将该表重命名为“预订”会更容易)。如果某个物业因维护而在某些日期不可用,则在客户“特殊”的日期(可能“客户”的id为负数)输入预订

有趣的建议。我必须做一些游戏,我会回来继续这个话题或者接受你的答案。我做了一些游戏,发现模式(id,property_id,date,state)是一个好的开始。这将导致每个可用日期都是表中的一行。特定日期的预订将更改状态变量。但我看到了这个解决方案的新问题。如果至少有两个用户发送了一个预订请求,要求将完全相同的7天存储到数据库中,该怎么办?如何确保这些用户之间不会发生混合预订任务?@user1014412:您的程序将首先检查该属性是否在给定日期可用(这是我在回答中写的查询)。该属性将对第一个用户可用,但对第二个用户不可用。由于此检查在两个用户将预订请求存储到db之前应用于这两个用户,因此我认为这不会将整个组绑定到一个特定用户。我将您的示例理解为状态变量的预检查,而不是某种锁。这导致我考虑了一些竞争条件,并强制为胜利者设置一个表写锁,然后他们可以将其更改写入db,对吗?我仍然坚持这个问题。我遇到了冲突,两个事件发生在同一天-签入和签出在同一个属性上,但由不同的用户执行。如果我坚持当前的方案(1个表,每个日期作为单独的行),我就不能实现这一点,因为我不能同时标记1个日期,可用和可用,或可用和预订,或预订和预订。从一个星期的周六到周六,我可能会经常遇到这种碰撞。我无法想象如何在一个表中可靠地实现这一点。你知道一个好方法吗?有趣的建议。我必须做一些游戏,我会回来继续这个话题或者接受你的答案。我做了一些游戏,发现模式(id,property_id,date,state)是一个好的开始。这将导致每个可用日期都是表中的一行。特定日期的预订将更改状态变量。但我看到了这个解决方案的新问题。如果至少有两个用户发送了一个预订请求,要求将完全相同的7天存储到数据库中,该怎么办?如何确保这些用户之间不会发生混合预订任务?@user1014412:您的程序将首先检查该属性是否在给定日期可用(这是我在回答中写的查询)。该属性将对第一个用户可用,但对第二个用户不可用。由于此检查在两个用户将预订请求存储到db之前应用于这两个用户,因此我认为这不会将整个组绑定到一个特定用户。我将您的示例理解为状态变量的预检查,而不是某种锁。这导致我考虑了一些竞争条件,并强制为胜利者设置一个表写锁,然后他们可以将其更改写入db,对吗?我仍然坚持这个问题。我遇到了冲突,两个事件发生在同一天-签入和签出在同一个属性上,但由不同的用户执行。如果我坚持当前的方案(1个表,每个日期作为单独的行),我就不能实现这一点,因为我不能同时标记1个日期,可用和可用,或可用和预订,或预订和预订。从一个星期的周六到周六,我可能会经常遇到这种碰撞。我无法想象这是怎么回事