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に入れる方法は何通りかあるので、要件に合わせて最適なものを選んでくださいな。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です