1

在我的应用程序中,用户应该能够定义可用的日期。IE。用户 joe 可以定义他有空:
- 从 2009 年 9 月 1 日到 2009 年 11 月 15 日,每周一、周三和周日 15:00 到 17:00 之间。- 2009 年 9 月 2 日 12:00 到 14:00 之间,以此类推...

日期最多可定义为未来 1 年。

用户可以添加、编辑和删除定义的日期。

其他用户可以搜索可用用户,即。- 查找所有可用的用户 8.09.2009 15:30

问题是如何设计允许创建和编辑循环日期和高效搜索的 sql 表。

我正在使用 postgresql,而是在寻找任何指导方针。也许有人有类似问题的经验?

提前致谢

4

4 回答 4

1

选项1

您将使用 3 列存储可用性(假设使用单个 id col 来标识用户)

availability_start, availability_end, user_id

基于日期时间的搜索将类似于

select
  user_id
from
  availability
where
  desired_datetime > availability_start
and
  desired_datetime < availability_end

根据您要提供的功能,您可能希望删除过去的日期。显然,您需要根据人们的循环日期定义来决定将日期存储到未来多远。

选项 2

如果它总是像选择一周中的个别日子和这些日子的时间一样简单。您可以将循环日期存储为

user_id, day_of_week, availability_time_start, availability_time_end

开始和结束时间不需要日期组件。根据一周中的一天和时间进行搜索将类似于

select
  user_id
from
  availability
where
  desired_day_of_week = day_of_week
and 
  desired_time > availability_time_start
and
  desired_time < availability_time_end

顺便说一句,有一些库可以帮助创建这种重复的日期模式,在我工作的地方我们使用这个(Java),很可能有适合您的语言的 RFC 2445 实现。

如果您使用类似的东西,那么您将不会存储实际日期,而只是存储重复模式的详细信息,这不会真正帮助您解决问题。我们通过非常简单地从重复定义中获取值并将它们保存到 db 一个字段到一列来存储这些详细信息。

然后,您还可以存储未来某个定义时间量的日期/时间,并根据对重复定义的任何更改重新计算这些日期/时间,这显然会成为一个相当大的操作,具体取决于人们有多少时间表以及未来有多远你想存储数据。

于 2009-09-02T11:08:25.320 回答
1

当我之前处理过这样的数据时,我采用了类似于此的“规则”方法来适应按日调度和块调度:

CREATE TABLE availability_rules (
  id SERIAL UNIQUE,
  user_id NOT NULL REFERENCES users(id),
  day_of_week INTEGER CONSTRAINT valid_day_of_week CHECK (day_of_week BETWEEN 0 and 6)
  start_time TIME,
  start_date DATE,
  end_time TIME,
  end_date DATE
);

注意:您需要向规则表添加额外的约束,以确保 end_date + end_time >= start_date + start_time 等。

然后,您可以创建一个“可用性”视图来生成带有 user_id、date、start_time 和 end_time 的规范化时间表。使用 8.4,使用新的 generate_series 日期时间功能很容易。( http://www.postgresql.org/docs/current/static/functions-srf.html ) 如果您使用的是 8.3 或更早版本,那么编写一个执行相同操作的函数很容易。

于 2009-09-02T11:18:00.417 回答
0

你可以做的是有一个具有以下设计的表:

Availability
  - userId, Foreign key to user table
  - startDate, datetime
  - endDate, datetime
  - startTime, datetime
  - endTime, datetime
  - monday, bit
  - tuesday, bit
  - wednesday, bit
  - thursday, bit
  - friday, bit
  - saturday, bit
  - sunday, bit

现在您可以使用以下(MSSQL 语法)检查某些工作日的可用性

SELECT * FROM User u WHERE EXISTS(
    SELECT 1 FROM Availability WHERE userId = u.id AND
    @startDate >= startDate AND @endDate <= endDate AND
    @startTime >= startTime AND @endTime <= endTime AND
    (monday = 1 OR tuesday = 1)
)

这将为您提供在@startDate 和@endDate 之间周一或周二@startTime 和@endTime 之间可用的所有用户。

于 2009-09-02T11:55:06.503 回答
0

您将希望将用户可用性存储在数据库中并使用编程语言来检查可用性,而不是在数据库本身中使用任何复杂的逻辑。使用 ORM 工具会使这更容易。

用户可用性将包括日期时间对的列表。

于 2009-09-02T10:56:42.863 回答