RDBMSでカレンダーデータを扱う方法
Googleカレンダーで予定を登録したりするけど、そういうようなものをDBで扱いたい。
いくつかの方法があった
よく分からない方法(詳細は省略)
ググったらSOのこんなページが出てきたんだけど、ちょっと無駄に複雑な気がした。
毎週x曜日系の繰り返しイベントも、毎週分レコードを作成する方法
以下のように2つテーブル用意するというアプローチもいくつか見つかった。これとかこれとか。
- イベント管理テーブル
- イベント実施予定テーブル:イベント1回につき1レコードを格納するテーブル
例えば、1度きりのイベントであれば2つのテーブルに1レコードずつ書き込む。
また、2013/11/1以降の毎月1日に実施する繰り返しイベントの場合、管理テーブルには1レコード書き込み、2番めのテーブルには開催日毎(2013/11/1, 2013/12/1, 2014/1/1・・・・)に1レコードを書き込む。
これはシンプルな方法で、いい方法が見つからなければこれにしようかと思った。
ただ、イベントの数が最終的には100万レコードを超える予定だったので、これだとイベント実施予定テーブルが1億行を超える可能性があったので、ちょっと躊躇してた。
RFC5545?
もう少し検索すると、SOでこんな質問が見つかった。
この中で、RFC5545を参考にして(&簡略化して)実装してはどうか、という回答があった。RFC5545ってのは「Internet Calendaring and Scheduling Core Object Specification」というもので、今回初めて知った。興味はあるけど、こちらもちょっと複雑かなーと思った。
SQL Serverのdbo.sysschedulesテーブルの仕組みを使う事にした
で、結局採用したのは、上のSOの別の回答でも紹介されていた、Microsoft SQL Serverのジョブの管理テーブル(dbo.sysschedules)の仕組み。
大ざっぱに説明すると、以下のようなフィールドを使う。
- freq_type: 日次、週次、月次等の種別。毎月第3金曜日、みたいなのにも対応。
- freq_interval: 各freq_type毎に異なる値が入るんだけど、freq_typeが月次の時にこのフィールドに10が入っていたら、毎月10日という意味。
- freq_relative_interval: 毎月第3金曜日、みたいな種別の時だけ使用する。
詳しくはTechNetのページを見てね。
その他の情報
その他、ニュースグループでこんなやりとりがあった。
長いので、全部読むと時間がかかるけど、その中でこんな本が紹介されていた。
他にもこんな本もあった。
DBで時間を扱うっていうテーマだけで、こんな分厚い本が出せるなんて、DB設計は奥が深い。しかし、これらの本は高いな・・・
まとめ
カレンダーやイベントデータをRDBMSに入れる方法は何通りかあるので、要件に合わせて最適なものを選んでくださいな。