5

MySQLデータベースにイベント時間を保存するための最良の方法を決定しようとしています。これらは可能な限り柔軟で、「単一のイベント」(特定の時間に開始し、必ずしも終了時間を必要としない)、「終日」および「複数日」のイベント、繰り返しのイベント、繰り返しの終日のイベントを表すことができる必要があります、おそらく「月の第3土曜日」タイプのイベントなど。

実証済みのデータベーススキームをいくつか提案してください。

4

5 に答える 5

5

表: イベント

  • StartTime (日時)
  • EndTime (dateTime) 終了時刻がない場合は null
  • RepeatUnit (int) null = noRepeat、1 = 時間、2 = 日、3 = 週、4 = dayOfMonth、5 = 月、6 = 年
  • NthDayOfMonth (整数)
  • RepeatMultiple (int) 例: RepeatUnit を 3 に設定し、これを 2 週間ごとに 2 に設定します。
  • Id - 必要に応じて、イベントを一意に識別するために StartTime が適している場合があります。
  • 名前 (文字列) - 必要に応じて、イベントに付けられた名前

これは役立つかもしれません。繰り返しがある場合、解釈するにはかなりの量のコードが必要になります。繰り返し単位よりも解像度が低い時間フィールドの部分は無視する必要があります。月の第 3 土曜日を実行するのも簡単ではありません...この種の機能を実行するためだけに NthDayOfMonth 情報が必要になります。

これに必要なデータベース スキーマは、繰り返しが発生する場所を特定するために必要なコードに比べて単純です。

于 2008-09-19T08:17:30.923 に答える
4

iCalendar 標準 (イベントを記録するため) に大まかに準拠するプランナー アプリケーションに取り組みました。RFC 2445または Apple Inc. によって発行されたこのスキーマ読んで、それらが問題に関連しているかどうかを確認してください。

私のデータベース スキーマ (定期的/終日イベントはその時点では考慮されていませんでした)

event (event_id, # primary key
       dtstart,
       dtend,
       summary,
       categories,
       class,
       priority,
       summary,
       transp,
       created,
       calendar_id, # foreign key
       status,
       organizer_id, # foreign key
       comment,
       last_modified,
       location,
       uid);

calendar_id前の表の外部キーはこれを参照します

calendar(calendar_id, # primary key
         name);

whileこれをorganizer_id参照します(共通名などの他のプロパティが欠落しています)

organizer(organizer_id, # primary key
          name); 

より読みやすい別のドキュメントがここにあります

お役に立てれば

于 2008-09-19T09:01:35.077 に答える
1

2 つのテーブルが必要です。1 つは繰り返しイベント (テーブル repeatevent) を格納するためのもので、もう 1 つはイベント (テーブル イベント) を格納するためのものです。単純なエントリは、イベント テーブルにのみ格納されます。繰り返しエントリは repeatevent テーブルに格納され、繰り返しイベントのすべての単一エントリもイベント テーブルに格納されます。つまり、繰り返しエントリを入力するたびに、単一の結果エントリをすべて入力する必要があります。これは、トリガーを使用するか、ビジネス ロジックの一部として行うことができます。

このアプローチの利点は、イベントのクエリが簡単であることです。それらはすべてイベント テーブルにあります。イベント テーブルに繰り返しイベントを保存しないと、SQL やビジネス ロジックが複雑になり、システムが遅くなります。

create table repeatevent (
id int not null auto_increment, 
type int, // 0: daily, 1:weekly, 2: monthly, ....
starttime datetime not null, // starttime of the first event of the repetition
endtime datetime, // endtime of the first event of the repetition
allday int, // 0: no, 1: yes
until datetime, // endtime of the last event of the repetition
description varchar(30)
)

create table event (
id int not null auto_increment,
repeatevent null references repeatevent, // filled if created as part of a repeating event
starttime datetime not null,
endtime datetime,
allday int,
description varchar(30)
)
于 2008-09-19T08:17:45.480 に答える
0

cronが行うのと同じ方法ですか?そのように開始時間と終了時間の両方を記録します。

于 2008-09-19T08:13:23.507 に答える
-2

datetime と mysql のビルトイン NOW() 関数を使用します。プロセスの開始時にレコードを作成し、プロセスの終了時に終了時間を追跡する列を更新します。

于 2008-09-19T09:41:26.010 に答える