【问题标题】:Database design - how can I have a recurring database entry?数据库设计 - 我怎样才能有一个重复的数据库条目?
【发布时间】:2012-03-08 06:54:29
【问题描述】:

我目前正在使用 FullCalendar JQuery 模块来允许用户创建个人时间表。事件被添加/更新到 SQL Server 数据库。这工作正常。

我正在尝试创建一个设施,其中每个用户都有一个数据库,该数据库存储了他们一年中的所有事件,其中一些事件可以重复并每周发生。

然后,我希望用户能够根据他们时间表中可用的时间段组织与其他用户的会议。

我不确定如何将这些重复事件集成到我的系统中,或者我的算法将如何处理这些重复事件。

我现在的设计是:

CREATE TABLE Users (
  user_id INT NOT NULL AUTO_INCREMENT,
  email VARCHAR(80) NOT NULL,
  password CHAR(41) NOT NULL,
  PRIMARY KEY (user_id)
);

CREATE TABLE Events (
    event_id INT NOT NULL AUTO_INCREMENT,
    title VARCHAR(80) NOT NULL,
    description VARCHAR(200),
    start_time DATETIME,
    end_time DATETIME,
    group_id INT NOT NULL,
        recurring boolean
);

CREATE TABLE Groups (
    group_id INT NOT NULL,
    user_id INT NOT NULL
);

这就足够了吗?我将如何拥有它以便每周在日历上呈现重复事件?如果我缺乏任何细节,请询问!非常感谢。

【问题讨论】:

  • 您如何确定重复开始和结束日期? start_time 和 end_time 列?
  • 是的,事件表的start_time和end_time。当用户创建事件时,这些时间将插入到表中。
  • 我建议阅读 iCal 或 .ics 规范(例如 en.wikipedia.org/wiki/ICalendar)是了解概念和问题的好起点。
  • 为什么?我没有使用 ICalendar?
  • 他问你关于日期的事。也就是说,从 2012 年 3 月 8 日到 2012 年 12 月 31 日,我们每周一下午 1 点到 2 点见。

标签: sql sql-server database-design timetable


【解决方案1】:

你可以使用类似下面的东西:

SELECT  *
FROM    Events
WHERE   Recurring = 0
UNION
SELECT  Event_ID,
        Title,
        Description, 
        DATEADD(WEEK, Interval, Start_Time) [Start_Time],
        DATEADD(WEEK, Interval, End_Time) [End_Time],
        Group_ID,
        Recurring
FROM    Events, 
        (   SELECT  ROW_NUMBER() OVER(ORDER BY Object_ID) [Interval]
            FROM    SYS.ALL_OBJECTS
        ) i
WHERE   Recurring = 1
AND     Interval <= 52 -- reccurs for 1 year

这将使所有事件重复 52 周(或您想要的任何时间段)。

顺便说一句,在您提到 sql server 的问题中,您已将该问题标记为 SQL server,但您的所有语法似乎都是 MySQL(AUTO_INCREMENT,布尔数据类型)。

【讨论】:

  • 哇,非常感谢您的回答!是的,我使用 SQL 语法编写它,因为这是我最熟悉的并且不想把它搞砸!太好了,请问在这种情况下,Interval 是如何填充的?
  • 它只是一个通过计算 sys.all_objects 中的行创建的数字列表,它是 sql_server 中的系统视图,包含(毫不奇怪)所有对象(表、键、索引、视图、过程等) .即使在其他空数据库中,此视图仍将包含一千多行,这对于您的要求应该绰绰有余。欲了解更多信息,请参阅row numberall objects
  • 我明白了,非常感谢您的解释。所以在 DATEADD(WEEK, Interval, Start_Time) [Start_Time] 行中,我可以问一下这里到底发生了什么吗?
  • 它增加了开始日期的周数,所以在示例中我发布了子查询 i 和事件表之间的交叉连接导致每个事件重复 52 次,每个事件都有一个开始日期上一次记录后的一周。
  • 如果我们在事件表中有像daily/weekly/monthly/orfewdaysinaweek这样的重复类型,我们如何处理incase?
最近更新 更多