2016-04-19 23 views
3

会議のスケジュールを保持するテーブルを作成する必要があります。スケジュール情報を保存する

デイリー 'エバーXの日': 会議があることをスケジュールすることができます。 Xは1〜6の間で指定できます。 Xセッション後に終了します。ここで、「セッション」は基本的にリピート数です。

ウィークリー 週のどの曜日が起こる可能性がありますか。月、火など1週間に1日以上選択できます。 終了日。

月刊 使用し それは(第一、第二など)が発生することができ、月の日を選択するか、彼らは「第一、第二、第三、第四または最後の」との日「月の検索から選択することができます、 "火曜日"、例えば、その月の第2金曜日と言っている。

どのようにこれらのシナリオをすべて1つのテーブルに保存できますか?

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

あなたは毎日、毎週、毎月などを持っていますが...まだ特定の日に会議が行われることを意味します...そうですか?したがって

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 
) 

私は、これはすべてのあなたのスケジュールオプションを捉えることができると信じて。

0

基本的に同じ機能を実装していたのですが、ストレージの容易さではなく、検索の容易さと編集/更新が最も重要であることがわかりました。

毎日すべての日付を計算する必要はなく、会議の日付をDBに照会したり、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) 
) 
0

使用A既存の基準。その基準はiCalendar RRulesとExDatesです。

ちょうど

が開催予定

を計算する existing library(C#)を使用varchar型としてデシベルでrecurranceルールを保存します
関連する問題