379 Stimmen

Wiederkehrende Ereignisse im Kalender - beste Speichermethode

Ich baue ein benutzerdefiniertes Ereignissystem, und wenn Sie ein sich wiederholendes Ereignis haben, das wie folgt aussieht:

Die Veranstaltung A wird ab dem 3. März 2011 alle 4 Tage wiederholt.

ou

Veranstaltung B wird ab dem 1. März 2011 alle 2 Wochen am Dienstag wiederholt.

Wie kann ich diese Daten in einer Datenbank so speichern, dass sie einfach abrufbar sind? Ich möchte keine Leistungsprobleme, wenn es eine große Anzahl von Ereignissen gibt, und ich muss durch jede einzelne gehen, wenn der Kalender gerendert wird.

23voto

Tim Ramsey Punkte 822

Während die vorgeschlagenen Lösungen funktionieren, habe ich versucht, mit Full Calendar zu implementieren, und es würde über 90 Datenbankaufrufe für jede Ansicht erfordern (da es den aktuellen, vorherigen und nächsten Monat lädt), was mich nicht gerade begeistert hat.

Ich habe eine Rekursionsbibliothek gefunden https://github.com/tplaner/When bei dem Sie einfach die Regeln in der Datenbank speichern und eine Abfrage durchführen, um alle relevanten Regeln zu erhalten.

Hoffentlich hilft das jemandem, denn ich habe so viele Stunden damit verbracht, eine gute Lösung zu finden.

Bearbeiten: Diese Bibliothek ist für PHP

17voto

Vladimir Punkte 171

Warum nicht einen ähnlichen Mechanismus wie bei Apache-Cron-Jobs verwenden? http://en.wikipedia.org/wiki/Cron

Für Kalender \scheduling Ich würde etwas andere Werte für "Bits" verwenden, um Standard-Kalender-Wiederholungsereignisse zu berücksichtigen - statt [Wochentag (0 - 7), Monat (1 - 12), Tag des Monats (1 - 31), Stunde (0 - 23), min (0 - 59)]

-- Ich würde etwas verwenden wie [Jahr (Wiederholung alle N Jahre), Monat (1 - 12), Tag des Monats (1 - 31), Woche des Monats (1-5), Tag der Woche (0 - 7)]

Ich hoffe, das hilft.

11voto

Ravinder_Chahal Punkte 223

Der RRULE-Standard wurde für genau diese Anforderung entwickelt, d. h. für das Speichern und Verstehen von Wiederholungen. Sowohl Microsoft als auch Google verwenden ihn in ihren Kalenderereignissen. Bitte lesen Sie dieses Dokument für weitere Details. https://icalendar.org/iCalendar-RFC-5545/3-8-5-3-recurrence-rule.html

5voto

tusharmath Punkte 9910

Ich habe eigens für diesen Fall eine esoterische Programmiersprache entwickelt. Das Beste daran ist, dass sie schemaunabhängig und plattformunabhängig ist. Sie müssen lediglich ein Selektorprogramm für Ihren Zeitplan schreiben, dessen Syntax durch die hier beschriebenen Regeln eingeschränkt ist -

https://github.com/tusharmath/sheql/wiki/Rules

Die Regeln sind erweiterbar, und Sie können jede Art von Anpassung hinzufügen, die auf der Art der Wiederholungslogik basiert, die Sie durchführen möchten, ohne sich um Schemamigrationen usw. kümmern zu müssen.

Dies ist ein völlig anderer Ansatz und kann einige Nachteile mit sich bringen.

4voto

Valentin Kuzub Punkte 10967

Das klingt sehr nach MySQL-Ereignissen, die in Systemtabellen gespeichert werden. Sie können sich die Struktur ansehen und herausfinden, welche Spalten nicht benötigt werden:

   EVENT_CATALOG: NULL
    EVENT_SCHEMA: myschema
      EVENT_NAME: e_store_ts
         DEFINER: jon@ghidora
      EVENT_BODY: SQL
EVENT_DEFINITION: INSERT INTO myschema.mytable VALUES (UNIX_TIMESTAMP())
      EVENT_TYPE: RECURRING
      EXECUTE_AT: NULL
  INTERVAL_VALUE: 5
  INTERVAL_FIELD: SECOND
        SQL_MODE: NULL
          STARTS: 0000-00-00 00:00:00
            ENDS: 0000-00-00 00:00:00
          STATUS: ENABLED
   ON_COMPLETION: NOT PRESERVE
         CREATED: 2006-02-09 22:36:06
    LAST_ALTERED: 2006-02-09 22:36:06
   LAST_EXECUTED: NULL
   EVENT_COMMENT:

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X