MySQLデータベースにイベント時間を保存するための最良の方法を決定しようとしています。これらは可能な限り柔軟で、「単一のイベント」(特定の時間に開始し、必ずしも終了時間を必要としない)、「終日」および「複数日」のイベント、繰り返しのイベント、繰り返しの終日のイベントを表すことができる必要があります、おそらく「月の第3土曜日」タイプのイベントなど。
実証済みのデータベーススキームをいくつか提案してください。
表: イベント
これは役立つかもしれません。繰り返しがある場合、解釈するにはかなりの量のコードが必要になります。繰り返し単位よりも解像度が低い時間フィールドの部分は無視する必要があります。月の第 3 土曜日を実行するのも簡単ではありません...この種の機能を実行するためだけに NthDayOfMonth 情報が必要になります。
これに必要なデータベース スキーマは、繰り返しが発生する場所を特定するために必要なコードに比べて単純です。
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);
より読みやすい別のドキュメントがここにあります
お役に立てれば
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)
)
cronが行うのと同じ方法ですか?そのように開始時間と終了時間の両方を記録します。
datetime と mysql のビルトイン NOW() 関数を使用します。プロセスの開始時にレコードを作成し、プロセスの終了時に終了時間を追跡する列を更新します。