Frage

Ich habe geplante Ereignisse zu speichern, (wie sagt Klasse mal, zum Beispiel), die auf einem wöchentlichen organisiert werden kann, täglich oder monatlich. Ereignisse können auftreten, sagen wir, jeden Montag und Mittwoch, oder jeden zweiten Donnerstag des Monats. Gibt es eine Möglichkeit, diese Informationen in einem RDBMS zu speichern, die 3nF haftet?

EDIT: Dies ist nicht Hausaufgaben; Ich baue etwas mit einem Freund für unsere eigene Erbauung und wir wollen es in 3NF.

Um genau zu sein, ich versuche, die Zeitpläne für die Masse und Beichte mal bei RC Pfarreien zu speichern. Diese können in einer Hölle von einer Vielzahl von Möglichkeiten, wie jeder Sonntag bei x Zeit oder jeden Di / Do zu einem anderen Zeitpunkt geplant werden. Manchmal ist es nur der dritte Freitag im Monat, und andere sind nur zu einer bestimmten Zeit einmal pro Jahr angeboten. Ich muss nicht nur diese Informationen speichern, aber fragen sie, so dass ich schnell eine umfassende Liste der verfügbaren Zeit in den nächsten Tag oder Woche oder was auch immer bekommen.

Ich nehme an, dass streng genommen 3NF ist keine Voraussetzung, aber es wäre für uns einfacher, wenn es war und es ist besser, um es den Schläger korrigiert weg zu bekommen als später unser Schema zu ändern.

War es hilfreich?

Lösung

Ja, ich gelöst habe dieses Problem mit meinem Mitarbeiter in folgenden Weise:

CREATE TABLE [dbo].[Schedule](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [StartDate] [datetime] NOT NULL,
    [EndDate] [datetime] NULL
)

CREATE TABLE [dbo].[ScheduleInterval](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [ScheduleID] [int] NOT NULL,
    [ScheduleIntervalUnitID] [int] NOT NULL,
    [Interval] [smallint] NOT NULL
)

CREATE TABLE [dbo].[ScheduleIntervalUnit](
    [ID] [int] NOT NULL,
    [Name] [varchar](50) NULL
)

INSERT INTO ScheduleIntervalUnit (ID, Name)
SELECT '1' AS [ID], 'Day' AS [Name] UNION ALL
SELECT '2' AS [ID], 'Week' AS [Name] UNION ALL
SELECT '3' AS [ID], 'Month' AS [Name] 

erstreckt sich über einen Zeitplan mit einer Länge von Zeit und Intervalle innerhalb dieser Zeitspanne auftreten. Der Zeitplan Intervalleinheit bestimmt die Länge des Intervalls (Tage wie in „alle anderen“ (2) oder „jedes dritte“ (3) etc.), Woche (Tag der Woche, wie Montag, Dienstag, usw.) und Monat (des Kalenderjahres). Mit diesem von Abfragen und Logik gegen die Datenbank durchführen können Pläne abzurufen.

Wenn Ihre Zeitpläne eine bessere Auflösung benötigen - bis hin zu Stunden, Minuten, Sekunden - Blick auf die Unix-Implementierung von cron. Ich begann ursprünglich diesen Weg nach unten, fand aber die oben ein viel einfacherer und wartbar Ansatz sein.

Ein einzelnes Datum / Zeitspanne - wie eine definierte Schulsemester beginnen 9. September und endet 4. November - können mehrere Zeitpläne enthalten (so jeden Montag für Kunst-Klasse, und „jeden zweiten Tag“ für Phys Ed - aber Sie werden müssen mehr tun für Feiertage und Wochenenden unter Berücksichtigung!).

Andere Tipps

Um die Regeln für "periodische Wiederholung" aufzeichnen, können Sie Inspiration von crontab nehmen 's-Format, außer natürlich, dass Sie Einschränkungen für Minuten und Stunden nicht benötigen, sondern Tag der Woche, Tag des Monats, und dergleichen. Seit mehr als einem (zB) Wochentag im Zeitplan sein könnte, für NF Zwecke werden Sie typische Zwischentabellen wollen wie verwendet, um viele zu viele Beziehungen darstellen, dh man mit nur zwei Fremdschlüssel pro Zeile (eine an der Hauptereignistabelle , einer des Wochentag an einen Tisch.) - und in ähnlicher Weise natürlich auch für Tage-of-Monat und dergleichen

Vermutlich jedes geplantes Ereignis würde dann auch eine Dauer hat, eine Kategorie, vielleicht einen Ort, einen Namen oder eine Beschreibung Beschreibung.

„Wie normal“ ist die Form (wenn Sie kümmern sich um die „Sets“ genommen haben mit dem viel Beziehung oben erwähnt) hängt vor allem davon ab, ob und wie diese verschiedenen Eigenschaften voneinander abhängig sind - zum Beispiel, wenn jedes Ereignis in einer bestimmte Kategorie die gleiche Dauer hat, erhalten Sie einen separaten Hilfstisch mit id, Kategorie und Dauer haben wollen und Fremdschlüssel in diese Tabelle verwenden, anstatt die paarige info wiederholen. Aber von dem, was Sie sagen, dass ich keine innere Verletzung der Normalform Regeln sehen, bis auf eine solche Abhängigkeit Möglichkeiten (die nicht inhärent sind, was wenig Sie über die Ereignisplanung festgelegt haben).

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