存储计划信息

时间:2016-04-19 01:52:05

标签: sql sql-server database database-design sql-server-2014

我需要创建一个表来保存会议日程。 会议可以安排为:

每日 '永远X天'。其中X可以在1到6之间。 X会话结束。会议地点'基本上是重复次数。

每周 它可以在一周中的哪几天发生。周一,周二等。每周可以选择一天以上。 它结束的日期。

每月 使用可以选择可以发生的月份的日期(第1个,第2个等) 或者他们可以从第一,第二,第三,第四或最后一个查找中进行选择。还有一天,星期一,星期二,说,例如"第二个星期五"这个月。

如何将所有这些场景存储在一个表中?

我在想:

CREATE TABLE schedule
(
   ID INT NOT NULL IDENTITY(1,1) PRIMARY KEY,
   StartDate DATETIME NOT NULL,
   EndTime TIME NULL,
   RepeatTypeID INT NOT NULL, // Daily, Weekly, Monthly, None
   // For Daily
   EveryDayCount INT NULL, // to handle 'every 3 days',
   RepeatCount INT NULL, // How many occurances. Can be shared with different RepeatTypes
   // weekly
   IsMonday BIT,
   IsTuesday BIT,
   etc // A field per day selection. Is there a better way?
   // Monthly
   MonthlyDayNumber INT NULL,
   MonthlyRepeatIntervalID INT, // Lookup table with '1st, 2nd, 3rd, 4th, Last'
   MonthlyDayRepeatSelection INT // Lookup on Monday, Tuesday etc
)

但这似乎效率低下。是否有更好的设计模式满足这些要求?

3 个答案:

答案 0 :(得分:0)

即使您有每日,每周,每月等......仍然意味着会议将在某个特定的日子发生......对吗?

因此

CREATE TABLE schedule
(
   ID INT NOT NULL IDENTITY(1,1) PRIMARY KEY,
   StartDate DATETIME NOT NULL,
   EndDate DATETIME NOT NULL,
   RepeatTypeID INT NOT NULL, // Daily, Weekly, Monthly, None
   RepeatCount INT NOT NULL,
   DayOn INT NOT NULL, // can be a calculated field based on start date using DAY function
)

我相信这可以捕捉所有的时间表选项。

答案 1 :(得分:0)

所以基本上我曾经实现了相同的功能,我发现,而不是易于存储,易于检索和编辑/更新是至关重要的。

您不希望每次都计算所有日期,您在数据库中查询会议日期,或者说您有类似showAllMeetingsForADate(somedate date)的功能,那么您不希望计算在运行时会议的日期。

从整体上看,最佳存储方式是将会议信息计算逻辑存储在一个表中,将所有会议日期存储在另一个表中,如下所示。

但是,对于会议信息的存储,您应该使用标准化表格。

安排明细表

CREATE TABLE DailyScheduleDetails
(
  ScheduleDetailsID INT PRIMARY KEY IDENTITY(1,1),
  RecurrenceCount INT NOT NULL
)

CREATE TABLE WeeklyScheduleDetails
(
  ScheduleDetailsID INT PRIMARY KEY IDENTITY(1,1),
  OnMonday bit,
  OnTuesday bit,
  OnWednesday bit,
--  ...
  OnSunday bit,
  EndByDate Date NOT NULL
)

CREATE TABLE MonthlyScheduleDetails
(
  ScheduleDetailsID INT PRIMARY KEY IDENTITY(1,1),
  MonthlyDayNumber INT NULL,
  MonthlyRepeatIntervalID INT, // Lookup table with '1st, 2nd, 3rd, 4th, Last'
  -- Here I'd suggest using 0 for Last
  MonthlyDayRepeatSelection INT // Lookup on Monday, Tuesday etc
)

<强>定时

CREATE TABLE schedule
(
   ID INT NOT NULL IDENTITY(1,1) PRIMARY KEY,
   StartDateTime DATETIME NOT NULL,
   EndDateTime DATETIME NULL,
   RepeatTypeID INT NOT NULL, // Daily, Weekly, Monthly, None
   ScheduleDetailsID INT
  )

<强> MeetingDates

CREATE TABLE MeetingDates
(
ID INT NOT NULL PRIMARY KEY IDENTITY(1,1),
MeetingID int,
MeetingStartDate datetime,
MeetingEndDate datetime -- because you can have meeting spanning days like 11:00 PM to 1:00 AM
--,user or guest information too
,CONSTRAINT FK_MeetingDates_Schedule FOREIGN KEY (MeetingID) 
    REFERENCES Schedule(ID)
)

答案 2 :(得分:0)

使用现有标准。该标准是iCalendar RRules和ExDates。

只需将重复规则存储在db中作为varchar

使用existing library(C#)计算即将到来的日期