Frage

Ich baue einen Kalender Website (ASP.NET MVC) Anwendung (man denke einfache Version von Outlook) und ich möchte, Kalenderereignisse starten unterstützen, die wiederkehrend (monatlich, jährlich usw.)

jetzt ist Isttermine in meinem bin zu speichern, aber ich wollte mit einem Rezidiv, wenn, um herauszufinden, ist es sinnvoll zu speichern Daten, um fortzufahren (mit einigen offensichtlichen Cutoff), oder soll ich speichere die Wiederholungsoptionen und erzeugt die Daten on the fly.

Es hat mir denken, wie Outlook, Mail google, etc. tut dies oder jede andere Dienstleistung, dass Träger Kalendereinträge wiederkehrend.

Gibt es irgendwelche Vorschläge dazu?

War es hilfreich?

Lösung

Trennen Sie Ihre Daten in zwei Teile: die „kanonischen“ Daten (die Wiederholungsregel) und „dienen“ (Daten erzeugt; schreibgeschützt neben Regeneration). Wenn die kanonischen Datenänderungen, regeneriert die „dienenden“ Daten an diesem Punkt. Für unendliche Rezidive, halten eine bestimmte Anzahl von Instanzen und erzeugt mehr, wenn Sie laufen (zum Beispiel, wenn der Benutzer schaut auf ihrem Kalender für das Jahr 2020).

Wenn Sie unendlich Prozessorgeschwindigkeit haben, nur die kanonischen Daten benötigen würde - aber in Wirklichkeit tut alle die Datum / Zeit Verarbeitung für alle Wiederholungsregeln auf alle Seitenansicht ist wahrscheinlich zu sein zu zeitaufwendig ..., so dass Sie aus einer gewissen Lagerung (und Komplexität) handeln, dass die wiederholte Berechnung zu speichern. Storage ist in der Regel ziemlich billig, verglichen mit der Berechnung für eine große Anzahl von Ereignissen erforderlich. Wenn Sie nur Notwendigkeit, die Termine der Veranstaltungen zu speichern, die wirklich sehr billig ist - Sie leicht eine 4-Byte-Ganzzahl verwenden könnte ein Datum darzustellen, und erzeugen dann eine vollständige Datum / Uhrzeit aus, dass, vorausgesetzt, Ihr Rezidive sind alle Datum basiert. Für zeitbasierte Rezidive (zum Beispiel „alle drei Stunden“), die Sie voll UTC Punkte könnten - 8 Bytes werden, dass bis zu einer ziemlich feinen Auflösung darstellen, so lange wie Sie wahrscheinlich Notwendigkeit sind

.

Sie müssen sich über die Aufrechterhaltung ihrer Gültigkeit vorsichtig sein, obwohl - wenn eine Besprechungs Änderungen heute , das nicht ändert, wenn es hat in der Vergangenheit passiert ist ... so wahrscheinlich Sie auch wurde kanonische schreibgeschützte Daten darüber, wann Rezidive tatsächlich aufgetreten ist. Natürlich werden Sie nicht wollen, dass die Vergangenheit für immer zu halten, so dass Sie wahrscheinlich zu „garbage collect“ wollen Ereignisse mehr als ein paar Jahre alt, je nach Speicherbeschränkungen.

Sie können auch die Fähigkeit benötigen Notizen und Ausnahmen hinzufügen (zum Beispiel „Sitzung tritt nicht heute wegen eines Feiertag“ oder „zog nach 04.00“) auf einer Pro-Vorkommen Basis. Das wird wirklich Spaß, wenn man die Wiederholung ändern - wenn man „jeden Montag“ bis „jeden Dienstag“ ändern halten Sie die Ausnahmen oder nicht? Wie passen Sie auch die Ausnahmen, wenn Sie von „jeden Tag“ auf „jede Woche“ ändern? Dies sind keine Fragen, die direkt zu den Lagern sind - aber die Speicher Entscheidungen beeinflussen, wie einfach es ist, zu implementieren, was Politik, die Sie entscheiden, auf

.

Andere Tipps

Sie müssen separat Veranstaltungen und Ereignisse behandeln.

EVENT WISE: Für Veranstaltungen, müssen Sie recurence Regeln speichern (die ein RRULE wie angegeben von rfc5545 sein können, aber auch eine explizite Reihe von Daten wie rdate in rfc5545), sondern auch Ausnahmen (EXDATE von rfc5545 sehen und möglicherweise exrule wie in RFC2445). Dort finden Sie auch den Überblick über Änderungen in diesen Regeln halten müssen: Änderungen in rdate sind EXDATE kein Problem, wenn sie in der Zukunft eintreten und für vergangene Tage, um ignoriert zu werden. Änderungen in RRULE sind komplizierter als vorherige Vorkommen beeinflussen. Meine persönliche Präferenz ist eine bestimmte Eigenschaft für den alten und neuen RRULE hinzufügen, um ihre jeweiligen Anfangs- und Enddatum der Gültigkeit angeben.

, wenn das Ereignis eine begrenzte Zeitspanne hat (sagen COUNT oder UNTIL Eigenschaft vorhanden ist) Sie Start und Ende in der Tabelle gespeichert werden sollen einfache Abfrage von Ereignissen zu ermöglichen (vor allem, wenn nach Vorkommen außerhalb Ihres vorberechneten Zeitfensters suchen (siehe unten ), kann sie die Anzahl der Ereignisse, für die dazu beitragen, die Berechnung ist nochmals gemacht) werden.

OCCURRENCES WISE: das Vorkommen sollten Sie Instanzen innerhalb eines vordefinierten Fensters um Gegenwart speichern (etwa +/- 6 Monate oder 12 Monate und auf einer regelmäßigen Basis berechnet) und Aufzeichnungen über diese erneute Berechnung, wenn die Benutzer weiter in die Zukunft sehen wollen, damit (für Leistungsprobleme). Sehen Sie sollen auch den Index (RECURRENCE-ID) die Berechnung einfaches Auffinden des nächsten Auftretens zu helfen.

weniger auf dem Back-End, aber mehr auf dem Front-End sollen Sie auch den Überblick über TZID Änderungen halten die Benutzer zu fragen, ob ein Ereignis, das zu einem bestimmten TZID geplant war, wenn es um Aufenthalt auf aktuelle Zeitzone ist gemeint, Bedürfnisse werden (in Samoa Insel denken Sie an jemanden, der am Freitag Zeitplan ein Treffen hatten, 30. Dezember 2011, bevor das Land an diesem Tag beschlossen würde existieren nicht) aktualisiert, ähnlich kann man fragen, ob ein Ereignis, das während des Tageslicht geschieht Zeitersparnis gemeint ist um zu diesem Thema „nie passieren“ oder „zweimal passieren“ (mehr hier )

Hinweis: Sie können Unterstützung darüber hinaus zu prüfen, was in rfc5545 in Bezug auf den recurence Regeln definiert ist, und auch die Unterstützung für religiöse wiederkehrende Regeln ( siehe USNO Einführung in Kalendern oder in gedruckter Form "von Kalenderberechnungen"(Third Edition) E. Reingol und N. Dershowitz).

Da Sie über bestehende Implementierung fragen, können Sie einfach das Datenbankschema von Sunbird überprüfen (SQLite) oder der hier )

Ich hatte ein System aufzubauen, das mit Planung gearbeitet und wir haben beide. Hier ist, was wir hatten,

  • eine Reihe von Tabellen, die den Überblick über den Zeitplan gehalten.
  • eine Tabelle, die den Überblick über vorherigen Instanzen der Zeitplan gehalten (wenn sie tatsächlich eingetreten ist)
  • eine Tabelle, die den Überblick über die nächsten und letzten Instanz gehalten (wenn der nächste Punkt beruht auf der Grundlage der letzten Zeit auftreten) Sie können diese Tabelle nicht brauchen, aber wir haben es, denn sonst würden Sie ständig werden die Berechnung, wenn ein Element sollte nun auftretende

Mit Terminplanung, die Dinge können wirklich schwierig, weil Sie, dass in der Zeit an jedem beliebigen Punkt erinnern müssen, kann der Zeitplan ändern. Auch kann ein Element sein fällig, wenn Ihre Anwendung nicht ausgeführt wird, und wenn es wieder anläuft, müssen Sie wissen, wie überfällige Forderungen zu identifizieren.

Auch haben wir darauf geachtet, dass die Tabellen, die den Überblick über den tatsächlichen Zeitplan gehalten standen allein. Der Grund dafür ist, dass diejenigen, der komplexeste Satz von Tabellen im System waren und wir wollten in der Lage sein, sie wieder zu verwenden, so dass sie für verschiedene Dinge verwendet werden könnte, die Terminierung erforderlich. Wie Admin-E-Mails, das Senden von Benachrichtigungen und Server-Wartung wie Protokolldateien bereinigen.

Ich würde auf jeden Fall Ihre zweite Option verwenden. Verwenden Sie verschiedene Wiederholungsoptionen, separat lagern und berechnen on the fly. alle jene Daten zu speichern wäre eine Schiffsladung von Daten sein, die nicht notwendig ist.

Hier ist eine gute Antwort auf Ihre Frage zu ergänzen.
Datenstruktur für wiederkehrende Ereignisse zu speichern?

Auch als eine Randnotiz. Ich habe angefangen, alles als UTC-Zeit zu speichern, so dass Sie eine gemeinsame Grundlinie haben, wenn Sie jemals mehrere Zeitzonen verwenden müssen.

Ich hatte ein ähnliches Problem in einer Web-Anwendung, die ich vor ein paar Jahren gemacht (es gut kann jetzt ein besserer Weg sein :)). Ich wollte einen Scheduler umfassen, die alle Funktionen der wiederkehrenden Ereignisse hatten, Erledigungszeit, Tage, Wochen, Monate, Jahre, und Ausnahmen, so dass ich Regeln haben könnte wie:

1) Jeden Tag um 10 Uhr Gestellt mittwochs

2) Alle 2 Stunden mit einem Maximum von 4 Wiederholungen pro Tag

3) Jeden ersten Montag des Monats

etc ..

Speichern der wiederkehrenden Termine / Zeiten möglich war, aber unflexibel. Jede Iteration Ihrer Veranstaltung ändert sich, wenn das „Maximum“ wäre. Und wie weit sind Sie aus?

Am Ende schrieb ich eine benutzerdefinierte Scheduling-Klasse, die von und Schreiben auf eine Zeichenfolge lesen konnte. Dies war die Zeichenfolge, die in der Datenbank und dann eine einfache Funktion gespeichert wurden, um herauszufinden, aufgerufen werden, wenn das nächste Vorkommen ist.

Sie müssen sicher einige von ihnen zu speichern. Der Benutzer kann bearbeiten eines der Ereignisse, so dass andere davon unberührt. (Sie wahrscheinlich die Frage getroffen. „Wollen Sie alle wiederkehrende Ereignisse zu bearbeiten wollen oder nur diese eine“ in einigen Kalender, zB Windows Mobile)

Sie können auch vergangene Ereignisse speichern möchten und sie nicht entfernen, wenn der Benutzer die wiederholten Veranstaltung löscht.

Wenn Sie alle anderen speichern oder sie erzeugen, ist eine Implementierung Detail. Ich würde es vorziehen, sich zu erzeugen, wenn möglich.

In jedem Fall sollten Sie einen Ausweis der wiederholten Veranstaltung mit jedem Ereignisse gespeichert haben, sowie einige Flaggen sagen Ihnen, wenn das Ereignis später geändert wurde. Oder in komplizierteren Ansatz, ein Flag für jedes Ereignis Eigenschaft erzählen, wenn es den Standardwert (aus der wiederholten Veranstaltung) oder wenn es wurde für diese bestimmte Instanz geändert. Sie werden diese benötigen, wenn der Benutzer das wiederkehrende Ereignis zu bearbeiten entscheidet.

Beachten Sie, dass die meisten Antworten neigen zu erzeugten Daten zu speichern. Aber stellen Sie sicher halten Sie für Ihren Anwendungsfall.

Zurück in den Tagen mein Server von io mit vielen CPU nichts zu tun begrenzt war. Heute haben Sie ssd (wenn Sie diejenigen leisten können, sonst mit einem alten Spinnerei hd links), aber beachten Sie, dass Kernzahl hat auch erhöht.

Die nette Sache über diese Art von Berechnungen ist, dass man ihnen leicht aufspalten und gibt sie an Ihre vielen Kerne oder sogar auf ein paar billigen Server in einem lokalen Netzwerk. Oft billiger als ein nosql Cluster oder gehen Sie die vollständige Datenbank-Cluster Art und Weise einrichten.

Und Alternative könnte auch ein Cache sein, nur die Kalenderansicht zwischenzuspeichern, keine Notwendigkeit, alle Berechnungen jedes Mal zu tun, wenn nichts geändert hat.

Aber wie gesagt auf den Anwendungsfall abhängt. Nicht nur die oben genannten Antworten folgen, aber Ihre eigenen Berechnungen tun, wenn Sie Zeit und als eine Entscheidung haben.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top