我需要创建一个表来保存会议日程。 会议可以安排为:
每日 '永远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
)
但这似乎效率低下。是否有更好的设计模式满足这些要求?
答案 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)