Database
 sql >> Datenbank >  >> RDS >> Database

Das Datenmodell für wichtige Daten

Hast du etwas vergessen? Ein Datenmodell, das Ihnen hilft, sich an wichtige Daten zu erinnern – bevor sie passieren.

Hast du jemals ein wichtiges Datum vergessen – den Geburtstag deiner Mutter oder deinen Hochzeitstag? Oder dass Sie einen Vortrag halten? Ja, solche Dinge passieren im wirklichen Leben. Vielleicht nicht für uns alle, aber für einige von uns (mich eingeschlossen) schon. Um solche Katastrophen zu verhindern, erstellen wir ein Datenmodell, das Sie als Hintergrund für eine Anwendung verwenden können, die Sie rechtzeitig benachrichtigt.

Es ist an der Zeit, sich von all den enttäuschten und traurigen Gesichtern und den nicht rechtzeitig gekauften Geschenken zu verabschieden. :)

Lassen Sie uns direkt in das Modell eintauchen.

Das Datenmodell

Unser Ziel ist es, ein Datenmodell für eine Anwendung zu erstellen, mit dem wir zukünftige Ereignisse und alle damit verbundenen Aktionen definieren können. Die App sollte Benutzer benachrichtigen, wenn sie eine bestimmte Sache im wirklichen Leben tun, und diese Sache als erledigt markieren, wenn sie abgeschlossen ist. Einige Aufgaben wiederholen sich, z. dieses Ereignis löst ein zukünftiges Ereignis zu einem von uns definierten Zeitpunkt aus.

Natürlich müssen wir auch Web- und Mobilanwendungen entwickeln, um dieses System wirklich nützlich zu machen. Aber konzentrieren wir uns zunächst auf das Datenmodell.




Das Modell besteht aus drei Themenbereichen:

  • User accounts & dates
  • Events & actions (definition)
  • Events & actions (real)

Wir beschreiben jeden dieser drei Themenbereiche in der Reihenfolge, in der sie aufgeführt sind.

Abschnitt 1:Benutzerkonten und Daten

Benutzer unserer Anwendung können eigene Benutzerprofile erstellen und wichtige Daten ihrer Wahl speichern. Um dies zu unterstützen, verwenden wir die folgenden Tabellen.

Das user_account Die Struktur der Tabelle ähnelt den in vielen Datenmodellartikeln beschriebenen, aber wiederholen wir sie noch einmal. Für jeden Benutzer speichern wir:

  • first_name und last_name – Vor- und Nachname des Benutzers.
  • user_name – Der vom Benutzer gewählte Benutzername.
  • password – Der Hashwert des vom Benutzer gewählten Passworts.
  • mobile – Die vom Benutzer angegebene Mobiltelefonnummer.
  • email – Die E-Mail-Adresse, die während des Registrierungsprozesses verwendet wurde.
  • confirmation_code – Ein Bestätigungscode, der an den Benutzer gesendet wird, um seine Registrierung abzuschließen.
  • confirmation_time – Wenn der Benutzer den Bestätigungsprozess abgeschlossen hat.
  • insert_ts - Der Zeitstempel, als dieser Datensatz eingefügt wurde.

Nachdem die Registrierung abgeschlossen ist, kann der Benutzer seine eigenen wichtigen Daten auswählen. Diese Liste wird in der selected_date-Tabelle gespeichert. Obwohl wir über Daten sprechen, wählt der Benutzer tatsächlich Regeln aus, die Daten angeben. Wir beschreiben zuerst alle Attribute in dieser Tabelle und besprechen dann, wie Benutzer mithilfe dieser Attribute Regeln festlegen können. Die Attribute sind:

  • user_account_id – Die ID des Benutzers, der diesen Datensatz eingefügt hat.
  • date_year , date_month und date_day - Ganzzahlwerte, die die Datumsteile darstellen (Jahr, Monat und Tag des Monats).
  • date_weekday – Eine Textdarstellung der Ordnungszahl des Wochentags. Wir verwenden Text, weil Benutzer damit komplexere Werte auswählen können – sie können sowohl den Wochentag als auch die Woche im Monat definieren, z. am zweiten Montag im Monat.

Bitte beachten Sie, dass alle vier Datumsteile NULL sein können. Wir werden keine Datensätze mit ausschließlich NULL-Werten zulassen, daher prüfen wir programmgesteuert, dass mindestens ein Datumsteil NICHT NULL ist.

Und jetzt ein paar Beispiele:

  • Wenn wir ein genaues Datum auswählen möchten, z.B. 31.12.2018, wir setzen Werte auf date_year =2018, date_month =12 und date_day =31. Dies definiert etwas, das nur einmal an diesem einzigen Datum passieren wird.
  • Wenn wir die Kombination date_year verwenden =2019 und date_month =1, wobei die verbleibenden zwei Werte NULL bleiben, dann definieren wir etwas, das sich im gesamten Januar 2019 wiederholen wird.
  • Die Kombination date_year =2019 und date_day =2 würde 2019 am zweiten Tag jedes Monats ein Ereignis auslösen.
  • Wenn wir den Wert einfügen , definieren wir etwas, das jeden zweiten Montag im Monat stattfinden wird.

Abschnitt 2:Ereignisse und Aktionen (Definition)

Ich habe ein vages „etwas“ erwähnt, aber dieses Etwas ist eigentlich ein Ereignis. Events und Aktionen sind die Gründe, warum wir hier sind. Wir möchten den Zeitbereich mit tatsächlichen Ereignissen und Handlungen in Verbindung bringen, die in der Zukunft stattfinden werden. In diesem Themenbereich speichern wir die Definitionen für alle Ereignisse und Aktionen. Diese Definitionen werden später verwendet, um tatsächliche Ereignisse und Aktionen zu erstellen.

Das event table ist definitiv die zentrale Tabelle in diesem Themengebiet, aber bevor ich sie beschreibe, möchte ich zwei Wörterbücher beschreiben, den event_catalog und das recurrence_interval . Beide haben die gleiche Struktur, mit einem automatisch inkrementierenden Primärschlüssel (id ) und das UNIQUE-Namensattribut.

Der event_catalog Wörterbuch speichert Werte wie „Geburtstag“, „Feiertag“, „Jahrestag“ und „Sonstiges“. Dies wird uns helfen, unsere Veranstaltungen zu klassifizieren.

Andererseits das recurrence_interval speichert Werte wie „Jahr“, „Monat“, „Woche“ und „Tag“. Dieser Wert bezeichnet die Zeiteinheit, die vergeht, bevor sich das betreffende Ereignis/die Aktion wiederholt (wenn es als wiederkehrendes Ereignis definiert ist). Wenn dieser Zeitraum verstreicht, wird eine neue Instanz desselben Ereignisses/dieser Aktion generiert.

Jetzt sind wir bereit, diesem Themengebiet auf den Grund zu gehen. Im event Tabelle definiert der Benutzer alle für ihn wichtigen Ereignisse. Für jedes Ereignis speichern wir:

  • selected_date_id – Referenziert die Datumsdefinition.
  • event_catalog_id – Bezeichnet die Art des Ereignisses.
  • description – Eine zusätzliche Textbeschreibung dieses Ereignisses.
  • recurring – Ein Flag, das angibt, ob das Ereignis wiederkehrt.
  • recurrence_interval_id – Definiert, wie oft sich das Ereignis wiederholt (Jahr, Monat usw.). Kombinieren der Datumsdefinition aus selected_date Mit dem Wiederholungsintervall können wir den Startpunkt des Ereignisses definieren und wie viele Ereignisse nach diesem Startpunkt automatisch erstellt werden. Auf diese Weise könnten wir etwa Folgendes definieren:„Ab dem 2. Montag in jedem Monat (das selected_date Tabelle), planen Sie automatisch tägliche Meetings (das event.recurrence_interval Attribut)“ .
  • recurring_frequency – Eine Zahl, die angibt, wie viele Einheiten (definiert durch recurrence_interval_id ) müssen bestanden werden, bevor dieses Ereignis erneut stattfindet (wenn es sich um ein wiederkehrendes Ereignis handelt). Für das vorherige Beispiel (tägliche Besprechungen) würden wir diesen Wert als 1 definieren.
  • recurring_times – Die Anzahl der Instanzen dieses Ereignisses. Für das vorherige Beispiel wäre dies „5“ (tägliche Besprechungen von Montag bis Freitag).

Als Nächstes müssen wir Personen (die dem Benutzer bekannt sind) Ereignissen zuordnen. Im person Tisch. Für jede Person definiert der Benutzer einen vollständigen Namen und zusätzliche Details (falls erforderlich).

Nun können diese Personen den Ereignissen des Benutzers zugeordnet werden. Im related_event Tabelle speichern wir Verweise auf das event und person sowie einige details über die Art dieser Beziehung. Bitte beachten Sie, dass dieselbe Person mehrmals für dieselbe Veranstaltung hinzugefügt werden kann. Dies kann sinnvoll sein, wenn wir mehr als einen Datensatz führen wollen, um ausdrücklich auf etwas Besonderes hinzuweisen (z. B. „Sofia zur Party einladen“; Sofia ist sowohl Partygast als auch Sängerin der Band auf der Party).

Die verbleibenden zwei Tabellen in diesem Themenbereich beziehen sich auf Aktionsdefinitionen.

Aktionen können alles sein, was mit dem Ereignis zu tun hat. Wenn wir uns zum Beispiel an Mamas Geburtstag erinnern möchten, wäre es toll, wenn die Anwendung uns sagen würde:„Denken Sie über das Geschenk nach, das Sie Ihrer Mama machen möchten“, „Kaufen Sie ein Geschenk für Mamas Geburtstag“, „Schenken Sie Mama sie B-day geschenk. Und ein paar Küsschen auch“ und schließlich „Du hast es auch dieses Jahr wieder erfolgreich gemacht. Bravo für dich (und für mich)!“

Okay, werden wir wieder ernst. Aktionen sind Sätze vordefinierter Texte, die Benutzer benachrichtigen sollen, wenn sie etwas tun sollen. Wir haben ein Wörterbuch mit vordefinierten Aktionstypen wie „fang an zu denken“, „kaufe ein Geschenk“, „finde einen Musiker“ usw. Eine Liste all dieser EINZIGARTIGEN Aktionen ist im action_catalog Tisch. Beim Definieren eines Ereignisses wählt der Benutzer eine oder mehrere action s in Bezug auf dieses Ereignis und definieren Sie die folgenden Werte für jeden von ihnen:

  • event_id – Die ID des zugehörigen Ereignisses.
  • action_catalog_id – Ein ausgewählter Wert aus dem action_catalog Wörterbuch.
  • description – Eine optionale Beschreibung dieser Aktion. Jedes Mal, wenn diese Aktion ausgelöst wird, prüft unsere Anwendung dieses Attribut, liest die Befehle und führt diese Aktion aus.
  • action_code – Eine strukturierte Textdefinition dieser Aktion.
  • starts_before – Legt fest, wie viele ausgewählte Zeiteinheiten bis zum Start dieser Aktion für das ausgewählte Ereignis vergehen (wenn es sich um eine wiederkehrende Aktion handelt). Wenn dieser Wert nicht definiert ist (d. h. auf NULL gesetzt ist), werden die Aktionen im selben Moment gestartet, in dem das Ereignis beginnt.
  • send_message – Ein Flag, das angibt, ob eine Nachricht an den Benutzer gesendet werden soll oder nicht.
  • recurring – Gibt an, ob diese Aktion wiederholt wird oder nicht.
  • recurring_interval_id – Bezeichnet das Intervall/die Einheit für die Wiederholung (wenn es sich um eine wiederkehrende Aktion handelt).
  • recurring_frequency – Bezeichnet die Anzahl der ausgewählten Einheiten, die zwischen zwei Wiederholungen derselben Aktion vergehen müssen (wenn es sich um eine wiederkehrende Aktion handelt).
  • recurring_times – Wie viele Instanzen dieser Aktion sollen wir erstellen?

Die Aktionswiederholung folgt demselben Muster wie die Ereigniswiederholung. Wenn die Aktion als wiederkehrend definiert ist, generieren wir nach dem definierten Zeitraum eine neue Aktionsinstanz.

Abschnitt 3:Ereignisse und Aktionen (real)

Bisher haben wir ein Datenmodell erstellt, mit dem wir Ereignisse einfügen und Aktionen definieren können. Jetzt kommen wir zu einem interessanteren Teil des Modells:tatsächliche Ereignisse und Aktionen.

Die event_instance Tabelle enthält eine Liste aller Ereignisse, die automatisch generiert oder manuell eingefügt wurden. Während die automatische Generierung ziemlich offensichtlich ist – deshalb haben wir dieses Modell erstellt – ist auch das manuelle Einfügen von Ereignissen möglich. Wir können davon ausgehen, dass ein Ereignis zum Fälligkeitszeitpunkt automatisch eingefügt wird, sodass wir normalerweise nur aktuelle und vergangene Ereignisse in dieser Tabelle haben. Dennoch kann es vorkommen, dass wir uns bereits um ein zukünftiges Ereignis gekümmert haben, z. Wir haben uns auf ein Treffen vorbereitet, das nächsten Monat stattfinden wird. In diesem Fall sollten wir in der Lage sein, ein zukünftiges Ereignis (Ereigniszeiten werden gemäß definierten Regeln vorgeschlagen) und alles, was mit diesem Ereignis zusammenhängt, manuell in diese Tabelle einzufügen. Andererseits wird unsere Anwendung dieses Ereignis nicht überschreiben oder duplizieren. Es erkennt Ereignisse, die wir bereits eingefügt haben, indem es den event_time verwendet Wert. Für jede Ereignisinstanz definieren wir Folgendes:

  • event_id – Verweist auf das event Definition.
  • event_time – Die tatsächliche Ereigniszeit im strukturierten Textformat.
  • insert_ts – Der tatsächliche Zeitstempel, als dieses Ereignis eingefügt wurde.
  • event_completed – Ein boolescher Wert, der angibt, ob das Ereignis abgeschlossen wurde oder nicht. Das Ereignis wird automatisch auf „abgeschlossen“ gesetzt, wenn alle zugehörigen Aktionen abgeschlossen sind. Es kann vom Benutzer auch manuell auf „abgeschlossen“ gesetzt werden.

Die event_idevent_time pair ist der alternative/EINZIGARTIGE Schlüssel dieser Tabelle.

Eine ähnliche Logik wird für action_instance Tisch. Aktionen werden auch automatisch generiert, wenn sie fällig sind. Wenn eine Aktion wiederkehrt, haben wir mehr als eine Aktion für dieselbe Ereignisinstanz definiert. Für jede Aktion definieren wir:

  • action_id – Verweist auf die zugehörige action .
  • event_instance_id – Verweist auf die zugehörige event_instance .
  • action_time – Der tatsächliche Zeitpunkt der Aktion in strukturiertem Textformat.
  • insert_ts – Ein tatsächlicher Zeitstempel, als dieses Ereignis eingefügt wurde.
  • action_completed – Ein boolescher Wert, der angibt, ob die Aktion abgeschlossen wurde oder nicht. Die Aktion wird vom Benutzer manuell auf „abgeschlossen“ gesetzt. Wenn die Aktionsinstanz auf „abgeschlossen“ gesetzt ist, werden keine neuen Instanzen generiert (selbst wenn die Definition dies vorsieht).

In dieser Tabelle ist der alternative/EINZIGARTIGE Schlüssel die Kombination aus action_idevent_instance_idaction_time .

Die letzte Tabelle in unserem Modell ist die message Tisch. Es wird verwendet, um die von Aktionen generierten Nachrichten zu speichern. Diese Nachrichten werden an Benutzer gesendet. Für jede Nachricht speichern wir:

  • action_instance_id – Die ID der action_instance die diese Nachricht generiert hat.
  • message_title – Der Titel der Nachricht.
  • message_text – Der Nachrichtentext, der eine Beschreibung enthält, warum diese Nachricht generiert wurde (d. h. Textfelder aus den zugehörigen Tabellen).
  • insert_ts – Der Zeitstempel, wann diese Nachricht generiert wurde.
  • message_read – Ein Flag, das angibt, ob die Nachricht vom Benutzer gelesen wurde.

Teilen Sie Ihre Gedanken zum Datenmodell für wichtige Ereignisse mit

Ich hoffe, Ihnen hat der heutige Artikel gefallen. Haben Sie jemals ein wichtiges Datum vergessen? Glaubst du, dieses Modell könnte dir helfen? Bitte teilen Sie uns dies in den Kommentaren unten mit.