2008-12-23 65 views
6

目前,我正在開發一個項目來管理服務器數據庫上的維護窗口等。基本上,我只需要準確到小時,但允許它們被設置爲允許或不允許一週中的每一天。每週計劃 - 如何將其存儲在數據庫中?

我對如何做到這一點有一些想法,但由於我自己工作,我不想在沒有反饋的情況下承諾任何事情。

爲直觀起見,它像流動的「圖」

| 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... 

是否有這樣做的標準方式或可能給我一些想法,資源...

  1. 製作一種可以輕鬆保存和恢復的格式
  2. 使其可在數據庫中搜索(例如,不必將其反序列化以搜索時間)

[更新]

值得一提的是,每天可能,儘管可能性不大,被設置爲 「允許,拒絕,允許,拒絕...等等...」。跨度不能保證是全天唯一的。

這也不是唯一的時間表,將有數百個設備,每個都有自己的時間表,所以它會變得毛茸茸......大聲笑?

Rob詢問是否需要跟蹤每個星期 - 事實並非如此。這是一個通用的時間表,將適用於整個年度(定期維護)

+0

你需要每週跟蹤的一年,或者這只是一個配置表中一般一週? – 2008-12-23 16:38:58

+0

對於我來說,您需要旋轉此表,因爲如果您想要在特定的一天中獲得所有的小時數,那麼您將需要返回24行,並且不會輕鬆訪問WHERE數據。在我看來,有7行24列更有意義,1行給你一整天的時間。 – TravisO 2008-12-23 16:41:24

回答

0

也許像

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

我會考慮(1)使用包括開始時間和結束時間的格式,並且星期幾的整數字段。我知道你說的塊總是一個小時,但這可以通過你的代碼來實施。另外,如果你的需求有一天會改變,那麼在步驟(2)中你會少得多擔心如果你的數據庫語句全部寫入假設1小時的塊。

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

對於(2),如果每一條都有一個與之關聯的開始和結束時間,那麼它很容易檢查任何給定的時間窗口:

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

(其中$time代表日期和時間你想檢查)。

允許或不允許每週的每一天將由單獨的記錄處理。恕我直言,這比一週中的每一天的硬編碼更靈活,因爲您將使用某種情況下的陳述或if-else開關檢查您感興趣的日期的正確的數據庫列。

注意:請確保您知道您的數據庫在一週中的整數日期使用哪種標準,並嘗試使代碼獨立於此(始終詢問數據庫)。我們在本週開始時(週日或週一)和起始指數(0或1)有很多不同的標準。

1

如果每週都會有所不同,那麼就像這樣設置表格;

TABLE: 
    StartTime DATETIME PrimaryKey 

如果設置了特定日期/小時的開始時間,則假定它被允許,否則拒絕。

如果它是一個通用的一週不改變,試試這個通用配置;

TABLE: 
    Hour INT, 
    Day INT, 
    Allow BIT 

然後爲每個小時/天組合添加行。

1

其實我已經使用過這樣的設計,基本上創建要定期安排由你想要的週期數除以時間跨度的位圖。因此,在您的示例中,您需要每週安排一個小時的時間表,因此您將擁有一個只有21個字節長的168位位圖。幾個日期時間是16個字節,你需要多行這些來表示給定星期的可能時間表,所以如果你關心所有的大小,我不認爲你能打敗它。

我承認這是一個有點棘手,處理,比以前的建議不夠靈活。考慮如果您突然想要使用1/2小時時間段,則需要將所有現有數據轉碼爲新的336位位圖並分配值。

如果你使用SQL,你可以將此作爲存儲二進制博客,做位操作,比較了一下是否是開啓還是關閉自己或你可以每一位存儲爲一列。 MS SQL Server最高可支持1024個標準或30個寬表,因此您可以輕鬆地將精細度降至10分鐘,而對於30k表可以更加精細。

我希望這會增加一點點不同的觀點,看它如何完成。如果你擔心空間/大小,或者如果你有幾十萬或幾百萬的數量,那真的只有這樣。

1

您可以很容易地在表中記錄「允許」時間。那樣,如果它不在那裏,那是不允許的。如果您需要更多變量的「時間表」,您可以輕鬆添加年份和月份字段。

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

對於2008年12月:

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

您有2008年12月所有天可以進行維修。不過你希望顯示。

1

每一個提出的解決方案是對我好,反正我會認爲這是一個你應該面對性能和/或表大小的問題。由於您可能會在時間與您的實體(即服務器)之間建立關係,所以size_number * entity_times會增加大小。如果你在每個時間段有一排,這可能是一個痛苦。

這個建議是表結構,但更高效的條款有點難看,當涉及到磁盤空間和表掃描的速度。

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 

考慮要16:00分配的例子 - 20:00正常運行時間上週日和週一的服務器,你將有隻有兩排像

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

你會認爲每一個丟失的行意味着服務器關閉。

如果你需要這個,你可以考慮在day列中使用DATE格式來設置特定的日期(即只在2013年10月2日16:00到20:00之間的正常運行時間)。

希望它可以幫助

相關問題