2012-03-07 189 views
1

我目前使用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 
); 

这会不会是足够了吗?我将如何获得它,以便每周在日历上呈现周期性事件?如果我缺乏细节,请询问!非常感谢你。

+0

您是如何确定重复开始和结束日期的? start_time和end_time列? – 2012-03-07 22:13:34

+0

是的,事件表的start_time和end_time。当用户创建一个事件时,这些时间被插入到表中。 – 2012-03-07 22:20:29

+0

我会建议阅读iCal或.ics规范(例如http://en.wikipedia.org/wiki/ICalendar),这将是一个开始掌握概念和问题的好地方。 – RET 2012-03-07 22:35:16

回答

2

您可以使用类似以下内容:

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,Boolean数据类型)。

+0

哇,非常感谢你的回答!是的,我使用SQL语法编写它,因为这是我最熟悉的,并且不想搞乱它!这很好,我可以问你在这种情况下Interval是如何填充的吗? – 2012-03-07 22:47:23

+1

它只是通过计算sys.all_objects中的行数创建的数字列表,该列表是sql_server中的一个系统视图,其中包含(不奇怪)所有对象(表,键,索引,视图,过程等)。即使在一个空的数据库中,这个视图仍然会包含超过一千行,这应该足够满足您的需求。欲了解更多信息,请参阅[行号](http://msdn.microsoft.com/en-us/library/ms186734.aspx)或[所有对象](http://msdn.microsoft.com/en-us/library /ms178618.aspx) – GarethD 2012-03-07 23:01:37

+0

我明白了,非常感谢你的解释。因此,在DATEADD(WEEK,Interval,Start_Time)[Start_Time]行中,我可以问一下到底发生了什么? – 2012-03-07 23:56:06