2008-12-23 10 views
6

Momentan arbeite ich an einem Projekt, um Wartungsfenster auf einer Datenbank von Servern usw. zu verwalten. Grundsätzlich muss ich nur bis auf die Stunde genau sein, aber zulassen, dass sie so eingestellt werden, dass sie erlauben oder verbieten jeden Tag der Woche.Wöchentliche Zeitpläne - Wie können Sie dies in einer Datenbank speichern?

Ich hatte ein paar Ideen, wie ich das machen kann, aber da ich alleine arbeite, möchte ich mich ohne etwas Feedback zu nichts verpflichten.

Um dies zu visualisieren, ist es so etwas wie das fließende „Graph“

| Sun | Mon | Tue | Wed | Thu | Fri | Sat | 
    ------------------------------------------- 
5AM |allow|allow|allow|deny |deny |allow|allow| 
    ------------------------------------------- 
6AM |allow|deny |deny |deny |deny |deny |allow| 
    ------------------------------------------- 
7AM |allow|deny |deny |deny |deny |deny |allow| 
    ------------------------------------------- 
8AM |allow|deny |deny |deny |deny |deny |allow| 
    ------------------------------------------- 
9AM |allow|deny |deny |deny |deny |deny |allow| 
    ------------------------------------------- 
... etc... 

ist Gibt es eine Standard-Weg, dies oder eine Ressource zu tun, die mir einige Ideen geben könnte ...

  1. Erstellen Sie ein Format, das einfach gespeichert und wiederhergestellt werden kann.
  2. Sie können es in der Datenbank durchsuchen (z. B. muss es für eine Suche nicht deserialisiert werden)

[Update]

Es ist erwähnenswert, dass ein Tag könnte auch unwahrscheinlich, aber die Einstellung "Zulassen, Abweisen erlaubt, verweigert ... etc ...". Die Spannweite ist nicht garantiert die einzige für den ganzen Tag.

Dies ist auch nicht der einzige Zeitplan, es wird Hunderte von Geräten mit jeweils eigenen Zeitplan geben, so wird es haarig werden ... lol ??

Rob gefragt, ob jede Woche verfolgt werden musste - tut es nicht. Dies ist ein allgemeiner Zeitplan, der für das gesamte Jahr (regelmäßige Wartung)

+0

Sie Work- Sie jede Woche des Jahres verfolgen müssen, oder ist dies nur eine Konfigurationstabelle für eine generische Woche? –

+0

Sieht für mich aus, Sie müssen diese Tabelle drehen, denn wenn Sie alle Stunden für einen bestimmten Tag erhalten möchten, müssten Sie 24 Zeilen ohne einfachen Weg zu den Daten zurückgeben. Es scheint mir so zu sein, dass 7 Zeilen mit 24 Spalten mehr Sinn machen, 1 Zeile gibt Ihnen alle Stunden für einen bestimmten Tag. – TravisO

+0

Interessante Idee Travis – Hugoware

Antwort

0

Vielleicht so etwas wie

TABLE: 
    StartTime DATETIME  PrimaryKey, 
    EndTime DATETIME  PrimaryKey, /*if you are positive it will be in one hour incerments then you might want to omit this one*/ 
    Monday BIT, 
    TuesDay BIT, 
    Wednesday BIT, 
    Thursday BIT, 
    Friday BIT, 
    Saturday BIT, 
    Sunday BIT 
8

Ich würde gelten für (1) mit einem Format, das sowohl Zeiten beginnen und Ende, und ein ganzzahliges Feld für den Wochentag. Ich weiß, dass Sie angegeben haben, dass die Blöcke immer eine Stunde sein werden, aber das kann durch Ihren Code erzwungen werden. Wenn sich Ihre Anforderungen eines Tages ändern, müssen Sie sich in Schritt (2) viel weniger Gedanken machen, als wenn Ihre DB-Anweisungen so geschrieben sind, dass sie 1 Stunde dauern.

CREATE TABLE maintWindow (
    maintWindowId int primary key auto_increment not null, 
    startTime  Time, 
    endTime  Time, 
    dayOfWeek  int, 
    ... 

Für (2), wenn jeder Datensatz eine Start- und Endzeit mit ihr verbunden hat, dann ist es sehr einfach für Fenster für einen bestimmten Zeitpunkt zu überprüfen:

SELECT maintWindowId 
FROM maintWindow 
WHERE $time >= TIME(startTime) AND $time <= TIME(endTime) AND DAYOFWEEK($time) = dayOfWeek 

(wo $time stellt die Datum und Uhrzeit, die Sie überprüfen möchten).

Das Zulassen oder Ablehnen für jeden Tag der Woche würde durch separate Datensätze behandelt werden. IMHO, das ist flexibler als hart-Codierung für jeden Tag der Woche, da Sie dann eine Art von Case-Anweisung oder wenn sonst verwenden, um die richtige DB-Spalte für den Tag, der Sie interessiert ist, zu überprüfen.

Hinweis: Stellen Sie sicher, dass Sie wissen, welchen Standard Ihre DB für den ganzzahligen Wochentag verwendet, und versuchen Sie, Ihren Code unabhängig davon zu machen (fragen Sie immer die Datenbank). Wir hatten viel Spaß mit verschiedenen Standards für den Start der Woche (Sonntag oder Montag) und den Startindex (0 oder 1).

+1

Dies ist definitiv der Ansatz, den ich verwenden würde. –

1

Wenn es jede Woche anders sein wird, richten Sie die Tabelle so ein;

Wenn eine Startzeit für ein bestimmtes Datum/eine bestimmte Stunde eingestellt ist, wird davon ausgegangen, dass es zulässig ist, andernfalls verweigern.

Wenn es sich um eine generische Konfiguration für eine generische Woche handelt, die sich nicht ändert, versuchen Sie dies;

TABLE: 
    Hour INT, 
    Day INT, 
    Allow BIT 

Fügen Sie dann Zeilen für jede Stunde/Tag-Kombination hinzu.

1

Ich habe diesen Entwurf schon einmal benutzt, im Grunde eine Bitmap für den Zeitraum, den Sie regelmäßig planen wollen geteilt durch die Anzahl der Perioden, die Sie wollen. In Ihrem Beispiel möchten Sie also einen Wochenplan mit stündlichen Perioden, so dass Sie eine 168-Bit-Bitmap haben, die nur 21 Byte lang ist. Ein paar Datumsangaben sind 16 Bytes zusammen und Sie brauchen mehrere Reihen davon, um die möglichen Zeitpläne für eine bestimmte Woche darzustellen. Wenn Sie sich also überhaupt für die Größe interessieren, glaube ich nicht, dass Sie sie schlagen können.

Ich gebe zu, es ist ein wenig komplizierter zu behandeln und weniger flexibel als die bisherigen Vorschläge. Wenn Sie plötzlich halbe Stunden benötigen, müssen Sie alle vorhandenen Daten in eine neue 336-Bit-Bitmap umwandeln und die Werte verteilen.

Wenn Sie SQL verwenden, können Sie dies entweder als Binär-Blog speichern und das Bit Twiddling ausführen, um zu vergleichen, ob ein Bit an oder aus ist, oder Sie können jedes Bit als Spalte speichern. MS SQL Server unterstützt bis zu 1024 für Standardtabellen oder 30k für breite Tabellen, so dass Sie die Granularität für eine 30k-Tabelle entweder auf 10 Minuten oder sehr viel feiner einstellen können.

Ich hoffe, dass dies eine etwas andere Perspektive wie es getan werden könnte. Es ist wirklich nur notwendig, wenn Sie sich Sorgen um Platz/Größe oder wenn Sie vielleicht 10 oder 100 Millionen von ihnen haben.

1

Sie könnten einfach die "erlaubten" Zeiten in einer Tabelle aufzeichnen. Wenn es nicht da ist, ist es nicht erlaubt. Wenn Sie einen variablen "Zeitplan" benötigen, können Sie problemlos ein Jahr- und Monatsfeld hinzufügen.

TABLE DBMaintSched 
     ID int PK 
     ServerID varchar(30) (indexed) 
     Day int 
     Month char(3) 
     DayOfWeek char(3) 
     Year int 
     StartDT DateTime 
     EndDT DateTime 

Für Dezember 2008:

SELECT * FROM DBMaintSched WHERE ServerID = 'SQLSERVER01' AND Month = 'DEC' AND Year = 2008 ORDER BY DAY ASC 

Sie haben alle Tage Dezember 2008, auf dem eine Wartung durchgeführt werden kann. Anzeige wie gewünscht.

1

Jede vorgeschlagene Lösung ist gut für mich, trotzdem würde ich diese hier in Erwägung ziehen, sollten Sie Probleme mit der Leistung und/oder Tabellengröße haben. Da Sie wahrscheinlich eine Beziehung zwischen der Zeit und Ihrer Entität (d. H. Einem Server) herstellen würden, wird die Größe um entity_number * entity_times erhöht. Wenn Sie für jede Zeitspanne eine Zeile haben, könnte das ein Schmerz sein.

Dieser Vorschlag ist etwas hässlicher in Bezug auf die Tabellenstruktur, aber effizienter, wenn es um Speicherplatz und Tabellen-Scan-Geschwindigkeit geht.

TABLE times 
    entityFK int -- your entity foreign key 
    day INT  -- 0-7 day identifier 
    bit time0 -- ON if the time 00:00 - 00:59 is being covered 
    bit time1 
    bit time2 
    -- more columns 
    bit time23 

Betrachten Sie das Beispiel, wo man 16.00 Uhr zuweisen möchten - 20:00 uptime an einen Server am Sonntag und Montag, werden Sie nur zwei Zeilen wie

entityFK | day | time16 | time17 | time18 | time19 | -- other bits are set to 0 
server1 0  1  1  1  1 
server1 1  1  1  1  1 

Sie, dass jeder davon ausgehen, fehlende Zeile bedeutet, dass der Server ausgefallen ist.

Wenn Sie dies benötigen, können Sie ein Datumsformat für die Tagesspalte verwenden, um bestimmte Daten festzulegen (d. H. Standzeit 2013/10/02 zwischen 16:00 und 20:00).

Hoffe, dass es

Verwandte Themen