【问题标题】:Need to store multiple date range values and retrieve them via sql需要存储多个日期范围值并通过 sql 检索它们
【发布时间】:2011-06-16 13:39:52
【问题描述】:

我正在构建一个房屋租赁系统。该系统存储房屋的资料,用户可以预订房屋出租一天到一年的时间。我已经完成了预订部分的所有设置,但客户要求我能够将某些日期和日期范围设置为不可预订的家庭。

房屋可以出租一整年,也可以出租 6 个月,或者在谨慎的日子里不可用,例如:避暑别墅等的假期和周末。

考虑到信息必须可以通过 sql 查询检索,我很困惑如何设置数据库表来存储这些信息。我的意思是考虑以下情况,除了周三、7 月 4 日、11 月 10 日至 12 月 25 日和 12 月 31 日,全年都可以出租房屋。

如何将其存储在数据库中并能够运行查询以检查设定日期之间的房屋可用性。我正在使用 php MySql

【问题讨论】:

  • 一种解决方法是将房屋“出租”给不可用的先生和夫人。或者设置一个单独的表格,其中包含不适用日期并进行双重过滤:查找指定范围内的可用房屋,除非它们被列入不适用表格中的黑名单。

标签: php sql mysql database-design date


【解决方案1】:

您描述了两个不同的概念:“星期三”与其说是一个日期范围,不如说是一种重复模式。 “周末”也是如此。

除了定义这些不可用日期的属性表之外,您可能还在查看两个不同的表:一个代表特定日期范围,另一个代表重复模式。

                         Property
                            |
              -------------- ---------------
             |                              |
PropertyUnavailableRecurrence PropertyUnavailableRange 

(请记住,您可能想找出较短的名称)

PropertyUnavailableRecurrence 需要存储将“星期三”和“周末”转变为可行的决策逻辑所需的信息。我无法为您建模,因为您以这种模式呈现的所有人都是一周中的特定日子,但我想您需要能够考虑“每月的第一天”或“每个月的第二个星期三”,但我不知道。无论如何,这是您需要存储这些信息的地方。

PropertyUnavailableRange 将只包含简单的FromTo 定义范围的日期。这部分很简单。

当然,另一种方法是采用应用程序中指定的重复模式并将它们转换为谨慎的PropertyUnavailableRange 记录,但您仍然需要设置一个表来存储这些重复数据并将谨慎的记录与重复发生,以便您可以管理它们。

【讨论】:

  • 必须在某处画线。存储属性不可用的日期或其他方式是否有意义。
  • @Ali:这是一个商业决策;因为我看不出存储任何一个的难度或复杂性有什么不同,所以归结为哪种方法对存储更有效。
  • 这有点难以假设,因为在这一点上,我们无法从信息中真正衡量是否会有更多的房屋全年不可用或可用。存储数据的复杂性似乎比处理数据的逻辑要少。就像我要在 6 月和 9 月之间存储 2 个月的可用性。突然之间,如果我需要在其间添加一周的例外情况 - 我需要将条目重置为两个可用期而不是一个。
  • @Ali:我认为出于设计的目的,最好保持简单。客户会输入这些信息吗?为什么不把定义日期范围的责任推给他们呢?你永远无法想出一个能够适应每一个可以想象的概念可能性的设计(比如两个月,中间有一周的例外);你所能做的就是设计一些可以产生所需输出的东西,即使输入需要按摩。
  • 其实它是一个与业主联系的机构。有一个完整的数据输入团队来完成这项工作 - 只是在记录每个无法预订的日期与在此处维护一组日期范围之间陷入困境。
【解决方案2】:

一种方法是创建一个表 PropertyUnavailable,其结构如下:

create table PropertyUnavailable
(
  property_id number not null,
  when        date not null
);

此表将在该属性因停电期(例如,每周三、节假日等)而无法使用的每一天都有一行。我忽略了你将如何存储模式的元信息——这个表想要的只是属性由于停电期而不可用的每一天的行。

我假设您还会有一个预订天数表 PropertyReserved,其结构与上述相同,外加一个用于 reservation_id 的外键(或类似的东西)。

现在要查看给定日期范围内哪些日期不可用/保留,sql 将是这样的:

SELECT a.when, 'blackout'
FROM PropertyUnavailable a
WHERE a.when between <from_date> to <to_date>
UNION ALL (
SELECT b.when, 'reserved'
FROM PropertyReserved b
WHERE b.when between <from_date> to <to_date>
);

如果查询没有返回任何内容,则该属性在指定的日期范围(from_date、to_date)之间可用。

【讨论】:

  • 我明白了,但问题是可能会有一年内仅可使用 2 个月的房产。这是否意味着我必须为该属性的不可用日期输入 300 多个条目?
  • 阿里,是的,你会的;但是,我认为您将拥有一个可以填充表格的生成器函数。填充表然后尝试为需求提出复杂的查询逻辑(这将很难维护)更容易,imo。
  • 那不是数据库。它是一个网格,用“X”填充,目的是提供简单的查询。如果您可以编写稍微复杂的查询,您将不会设计“数据库”来适应简单的查询。
  • 从技术上讲,它一开始不会被填充到数据库中。了解此练习每年进行一次。
【解决方案3】:

您是否考虑过简单地以系统的名义预订那些“无法预订”的日期?

【讨论】:

    【解决方案4】:

    您似乎不清楚需要在数据库中存储什么;以及代码段中需要什么。暂时搁置“不可预订”的日期,假设您只有实际预订的日期。猫叫有道理。当您搜索可用日期时,您当前的代码是什么样的?

    SQL 非常有能力处理日期和执行日期运算。我的 NonSQL 不是,你将不得不在数据库中存储比在真实 SQL 中更多的东西。但是您不需要按日期存储行。 Reservation 表只需要 FromDate 和 ToDate。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-02-21
      • 2018-05-16
      • 1970-01-01
      • 2016-06-14
      • 1970-01-01
      • 2017-10-22
      • 1970-01-01
      • 2012-04-27
      相关资源
      最近更新 更多