2012-04-25 11 views
1

フロントエンドとしてFullCalendarを使用してカレンダーシステムを構築しています。バックエンドはMySQL/PHPになります。iCalバックエンド - 定期的な日付

これは、アプリケーションによって生成され、挿入されたユーザーの公開予定リストを格納します。これらのアポイントメントは、同じ日に開始され、終了する単一のイベントになります。さらに、ユーザーは個人的なコミットメントのために、カレンダーに自分の不可能を記入することができます。後者の機能には、定期的なイベントの使用が必要です。ホイールを再発明するのではなく、iCalに基づいた構造を使用して検討してきました。この投稿は、データベース構造の決定に非常に役立ったical-field-list-for-database-schema-based-on-ical-standardでした。

個人用の定期的な予定を保存するために必要なデータを入力するためのアプリケーションフォームを作成しました。フォームを提出すると、データはAjax経由でサーバーに送信されます。私は、ユーザーが入力したパラメータに基づいて、ネイティブ形式またはRRULEを使用して、繰り返し日付の配列を生成する優れたPHPスクリプトを発見しました。

私は、これらの定期的な日付を保存/取得するための最良の方法は何か分かりません。アプリケーションは、パブリックとプライベートの日付を含む、ユーザーのカレンダービューをレンダリングできる必要があります。アプリケーションはまた、たとえば、所与の時間/日付期間に無料である可能性があるすべてのユーザーを返すことができる必要があります。

すべてのイベントをiCal形式で保存し、必要に応じてイベントを取得するだけで十分ですか?私が予見している問題は、繰り返されるイベントは、即座にそのパラメータを拡張する必要があるため、簡単に検索できないということですか?私は、それを作成した元のRRULEへの参照を元に、(生成された)個々のイベントの2番目のテーブルを作成することを検討していました。私は、ユーザーが次の100年間毎日イベントに参加できないようにするために、ユーザーが入力する可能性のある定期的な日付の数を制限することを検討します。私は、このアプローチは、もともと反復ルールによって作成された個々のイベントを編集することにもなると私は思う。

これは良いアプローチですか、それとも良い方法がありますか?

その後
CREATE TABLE RecurringAppointments (
    startdate DATE NOT NULL, 
    enddate DATE, 
    freq  INT NOT NULL, -- contains #days between each occurrence 
    -- etc. 
) 

は、与えられたthedateで発生するすべてのそのような予定を取得するには:次の行に沿って表についてどのように

答えて

1

when building a calendar app, should i store dates or recurrence rules in my database?を見てください。

有効性情報に関連付けられたrrule、exrule、rdate、exdateを保存する必要があります(過去の変更を追跡できるようにする:特定のイベントが発生したときに過去を振り返りたい場合など出現時刻と出現時刻との間で変化する)、 発生回数が有限であるイベントについては、より簡単なクエリーのために時間ウィンドウの開始と終了の事前計算を行い、あなたはテーブル内のすべての出来事の出現を持っています。ユーザーが時間枠の外に出現した場合(1年以上前または1年以上前に見えることは稀です)、ユーザーが要求している時間窓に固有の関連イベントを計算し、それらを即座に生成します。

+0

私はこのサイトを検索しましたが、有益な情報がたくさんあるこのリンクされたページを見つけることができませんでした - ありがとう。私は、2テーブルのアプローチは正しいと思いますが、それは今度はイベントテーブルを生成するルルルです。私は決して終わらない(または長時間走っている)出来事や、それらを制限するか、周期的に(おそらくcronの仕事で)展開するかどうかを考える必要があります。カレンダーは、作成したユーザーだけではなく、システムによって「空きスロット」を見つけるために照会する必要があるため、関連する時間枠をカバーするすべてのユーザーのためにルルールを完全に拡張する必要があります( s)。 – Dave

1

SELECT * FROM RecurringAppointments 
WHERE 
     thedate BETWEEN startdate AND enddate 
    AND DATEDIFF(thedate, startdate) % freq = 0; 
+0

返信いただきありがとうございます、私はあなたの例を使用して見ていきます。私は、テーブルを追加するというコンセプトと、これが正しいアプローチかどうかという点にもっと興味があります。 iCalにはいくつかの例がありますが、イベントを管理する最良の方法についてはあまり多くありません。 – Dave

+0

iCalはシステム間でカレンダーデータを交換するのに適したフォーマットだと思いますが、システム内のカレンダーデータを構造化するのに最適ではないでしょうか?上記の手法を別のテーブルとして実装するか、より一般的な 'Appointments'テーブルにそのようなフィールドを追加するかは、あなた次第です。 – eggyal

+0

あなたの返信は高く評価されましたが、カレンダーシステムのiCalフォーマットとRRULESの使用に関する質問、2番目のテーブルが必要か(必要かどうか)、そして私の考えとアプローチ私はiCalとRRULES形式を使って将来の日付のリストを生成することに決めました。これらは別のテーブルに格納されます。複雑さは、ユーザがシーケンス内の日付の一部または全部を更新したい場合に発生します。 – Dave

関連する問題