質問

週ごと、日ごと、または月ごとに整理できるスケジュールされたイベント(たとえば、授業時間など)を保存する必要があります。イベントは、たとえば、毎週月曜日と水曜日、または毎月第2木曜日に発生する可能性があります。この情報を3NFに準拠したRDBMSに保存する方法はありますか?

編集:これは宿題ではありません。私は自分の啓発のために友人と何かを構築していますが、3NFでそれを望んでいます。

具体的には、RC教区での大量および告白のスケジュールを保存しようとしています。これらは、毎週日曜日にx時間、毎週火曜日と木曜日に異なる時間など、さまざまな方法でスケジュールできます。時々、それは月の第三金曜日だけであり、他は年に一度特定の時間にのみ提供されます。この情報を保存するだけでなく、クエリを実行して、翌日または週などの利用可能な時間の包括的なリストをすばやく取得する必要があります。

厳密に言えば、3NFは必須ではありませんが、もしそうなら、後でスキーマを変更するよりも、すぐに修正する方が簡単です。

役に立ちましたか?

解決

はい、次の方法で同僚とこの問題を解決しました。

CREATE TABLE [dbo].[Schedule](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [StartDate] [datetime] NOT NULL,
    [EndDate] [datetime] NULL
)

CREATE TABLE [dbo].[ScheduleInterval](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [ScheduleID] [int] NOT NULL,
    [ScheduleIntervalUnitID] [int] NOT NULL,
    [Interval] [smallint] NOT NULL
)

CREATE TABLE [dbo].[ScheduleIntervalUnit](
    [ID] [int] NOT NULL,
    [Name] [varchar](50) NULL
)

INSERT INTO ScheduleIntervalUnit (ID, Name)
SELECT '1' AS [ID], 'Day' AS [Name] UNION ALL
SELECT '2' AS [ID], 'Week' AS [Name] UNION ALL
SELECT '3' AS [ID], 'Month' AS [Name] 

スケジュールは時間の長さにわたっており、間隔はその時間内に発生します。スケジュール間隔の単位は、間隔の長さ(「その他」(2)または「3分の1」などの日)、週(月曜日、火曜日などの曜日)を決定します、および(暦年の)月。これを使用して、データベースに対してクエリとロジックを実行し、スケジュールを取得できます。

時間、分、秒など、より良い解像度が必要な場合は、 cron のUnix実装をご覧ください。私はもともとそのルートを開始しましたが、上記ははるかに単純で保守可能なアプローチであることがわかりました。

単一の日付/時間範囲(9月9日から11月4日までの定義された学期など)には、複数のスケジュールを含めることができます(したがって、アートクラスの場合は毎週月曜日、Phys Edの場合は「隔日」-しかし、休日や週末を考慮するには、さらに作業が必要です!)。

他のヒント

「定期的な繰り返し」のルールを記録するには、 crontab の形式。もちろん、分や時間の制約は必要なく、曜日や月などに制限する必要はありません。複数の(例えば)曜日がスケジュールに含まれている可能性があるため、NFの目的で、多対多のリレーションシップを表すために使用される一般的な中間テーブル、つまり行ごとに2つの外部キー(イベントのメインテーブル、平日のテーブルに1つ)-もちろん、月の日などにも同様に。

おそらく、スケジュールされた各イベントには、期間、カテゴリ、おそらく場所、名前または説明の説明も含まれます。

"通常の状態"フォーム(上記の多対多の関係で「セット」を処理したら)は、これらのさまざまな属性が相互に依存するかどうかと、その方法に大きく依存します。たとえば、特定のカテゴリのすべてのイベントに同じ期間、ID、カテゴリ、期間のある補助テーブルを用意し、ペア情報を繰り返すのではなく、このテーブルに外部キーを使用します。しかし、あなたが言うことから、正規形ルールの本質的な違反は見られません、そのような依存関係の可能性を除いて保存します(イベントのスケジューリングに関してあなたが指定した小さなことに固有ではありません)。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top