Datenbankentwurf für wiederkehrende Ereignisse mit Ausnahmen

8

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:

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!

    
iyn 02.06.2015, 18:32
quelle

1 Antwort

5

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: Ссылка

    
Neil McGuigan 02.06.2015, 20:23
quelle