Ich baue ein System, das verschiedene Arten von Ereignissen speichern / verwalten muss. Der Einfachheit halber werde ich mich auf die Gestaltung eines Kalenders konzentrieren (ich baue etwas anderes, aber der Kalender ist eine gute Analogie und es ist einfach, darüber nachzudenken). Ich würde gerne über mögliche Datenbank / Schema-Design-Ideen hören.
Problembeschreibung
Ich habe einen Kalender mit verschiedenen Arten von Ereignissen (der Einfachheit halber sagen wir, dass es nur einen Ereignistyp gibt: Aufgabe). Der Benutzer kann ein neues Ereignis für ein bestimmtes Datum hinzufügen, bearbeiten (Details ändern, Titel ändern oder zu einem anderen Datum wechseln) oder löschen. Es kann einmalige Ereignisse und wiederkehrende Ereignisse geben (mit verschiedenen Arten von Wiederholungen: alle X Tage, jeden 15. Tag des Monats, jede Woche am Montag; so ähnlich wie einfache Cron). Wenn ein Benutzer ein wiederkehrendes Ereignis verschiebt, werden alle anderen Instanzen dieses Ereignisses auf dieselbe Weise verschoben (z. B. +3 Tage). Wichtiger Teil: wiederkehrende Ereignisse können Ausnahmen haben. Nehmen wir zum Beispiel an, dass ich ein wiederkehrendes Ereignis A habe, das alle 7 Tage wiederholt wird. Aber ich möchte das Datum für die nächste Woche ändern, also wird es statt Dienstag am Freitag zugewiesen, danach am Dienstag. Dieses "Ausnahme" -Ereignis sollte nicht beeinflusst werden, wenn das "Eltern" -Ereignis verschoben wird.
Außerdem kann jedes wiederkehrende Ereignis zusätzliche Informationen enthalten, die nur zu einer bestimmten Instanz gehören, zB: Ich habe das gleiche wiederkehrende Ereignis A, das alle 7 Tage wiederholt wird. Ich möchte eine Notiz für diese Woche hinzufügen, die "X ", und ich möchte eine weitere Notiz für das Ereignis A nächsten Monat hinzufügen, das" Y "sagt - diese Felder sind nur für diese einzelnen Instanzen sichtbar.
Ideen
System mit regelmäßigen, einmaligen Ereignissen ist ziemlich einfach, deshalb werde ich das nicht diskutieren und mich nur auf wiederkehrende Ereignisse konzentrieren.
1. Eine mögliche Lösung ist die, die der OOP ähnelt: Ich kann eine Event
"class" mit Feldern wie start_date
, end_date
(kann null
sein) , recurrence_type
(etwas wie enum mit möglichen Werten von EVERY_X_DAYS
, DAY_OF_WEEK
, DAY_OF_MONTH
) und recurrence_value
(sagen wir 7
). Wenn der Benutzer ein neues wiederkehrendes Ereignis hinzufügt, erzeuge ich einfach ein solches Event
in der Datenbank. Wenn der Benutzer 1 Vorkommen dieses Ereignisses ändern möchte, füge ich einen neuen Eintrag zum DB vom Typ / class MovedEvent
hinzu, der von Event
mit anderem Datum "erbt" und das zusätzliche Feld related_to
hat, das auf das% co_de verweist % (oder ID
, wenn du willst) des UUID
, auf das es sich bezieht. Aber gleichzeitig muss ich alle Event
s im Auge behalten (sonst hätte ich 2 Ereignisse in der gleichen Woche angezeigt), also muss ich ein Array MovedEvent
von moved_events
s haben, das zeigt an alle ID
s.
Nachteil : jedes Mal, wenn ich den Kalender anzeigen möchte, muss ich MovedEvent
abrufen und alle Ereignisse aus Event
auswählen, was nicht optimal ist, wenn ich viele verschobene Ereignisse habe.
2. Eine weitere Idee besteht darin, jedes Ereignis als separaten Datensatz zu speichern. IMO, es ist eine schreckliche Idee, aber ich erwähne es nur, weil es eine Möglichkeit ist. Nachteile : Jedes Mal, wenn ich das Hauptereignis bearbeiten möchte (zB: Ich möchte das Ereignis von "alle 7 Tage" auf "alle 9 Tage" ändern), muss ich jedes einzelne Vorkommen des Veranstaltung. "Ausnahmen" (Ändern einzelner Instanzen) ist jedoch einfacher.
SQL / NoSQL? Details skalieren
Ich verwende PostgreSQL in meinem Projekt, aber ich habe grundlegende Kenntnisse in NoSQL-Datenbanken und wenn sie besser für diese Art von Problem geeignet sind, kann ich es verwenden.
Maßstab: Nehmen wir an, ich habe 5k Benutzer, und jeder wird durchschnittlich 150 Ereignisse / Woche haben, von denen 40% "Ausnahmen" sein können. Daher möchte ich dieses System als effizient gestalten.
Ähnliche Fragen & amp; Andere Ressourcen
Ich habe gerade angefangen, Martin Fowlers "Recurring Events for Calendars" ( Ссылка ) zu lesen, aber ich bin mir nicht sicher wenn es sich auf mein Problem bezieht und wenn ja, wie würde man das Datenbankschema nach diesem Dokument gestalten (Vorschläge sind willkommen).
Es gibt ähnliche Fragen, aber ich habe keine Erwähnung von "Ausnahmen" gesehen (das Ändern einer Ereignisinstanz, ohne andere zu beeinflussen), aber vielleicht findet jemand diese Links nützlich:
Designfrage: Wie würden Sie? ein wiederkehrendes Ereignissystem entwerfen?
Optimales Design für eine Datenbank mit wiederkehrendem Ereignis
Wiederkehrende / wiederholende Ereignisse im Kalender - Beste Speichermethode
Entschuldigung für eine lange Frage, ich wollte das Problem gut beschreiben. Trotzdem finde ich das ziemlich chaotisch. Wenn Sie weitere Fragen haben, werde ich Ihnen gerne weitere Details geben. Auch hier möchte ich gerne Informationen zu möglichen Datenbank- / Schemadesignideen und anderen Vorschlägen erhalten. Danke!
Verwenden Sie iCalendar RRules und ExDates
Wenn es sich um ein wiederkehrendes Ereignis handelt, speichern Sie einfach die Start- und Enddatumszeiten sowie RRules und ExDates für das Ereignis.
Verwenden Sie eine materialisierte Ansicht, um bevorstehende tatsächliche Ereignisse vorauszusagen, etwa für die nächsten 30 Tage oder 365 Tage.
Da Sie Postgres verwenden, können Sie vorhandene RRule-Bibliotheken für Python, Perl oder JavaScript verwenden (z. B. dateutil ) innerhalb pg Funktion für die Berechnung zukünftiger Ereignisse auf der Grundlage der Regeln und Exdates
UPDATE: Überprüfen Sie die Erweiterung pg_rrule: Ссылка
Tags und Links sql database database-design calendar recurring-events