11

目前,我正在开展一个项目来管理服务器数据库等的维护窗口。基本上,我只需要精确到小时,但允许将它们设置为每天允许或禁止一周中的。

我对如何做到这一点有一些想法,但由于我自己工作,我不想在没有反馈的情况下承诺任何事情。

为了可视化这一点,它就像流动的“图表”

    | 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询问是否需要跟踪每周 - 不需要。这是适用于全年的通用时间表(定期维护)

4

7 回答 7

12

对于 (1),我会考虑使用包含开始时间和结束时间的格式,以及一周中某一天的整数字段。我知道你说这些块总是一小时,但这可以通过你的代码来强制执行。此外,如果您的需求有一天发生变化,那么您在步骤 (2) 中的担心要比您的 DB 语句全部编写为假设 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表示您要检查的日期和时间)。

一周中每一天的允许或禁止将由单独的记录处理。恕我直言,这比一周中的每一天的硬编码更灵活,因为您将使用某种 case 语句或 if-else 开关来检查您感兴趣的那一天的正确 DB 列。

注意:确保您知道您的数据库在一周中的整数天使用哪种标准,并尝试使您的代码独立于它(始终询问数据库)。对于一周开始(周日或周一)和起始索引(0 或 1)的不同标准,我们玩得很开心。

于 2008-12-23T16:40:57.583 回答
2

如果每周都不一样,那么就这样设置表;

TABLE:
    StartTime DATETIME    PrimaryKey

如果设置了特定日期/小时的开始时间,则假定它是允许的,否则拒绝。

如果是通用一周的通用配置不变,试试这个;

TABLE:
    Hour  INT,
    Day   INT,
    Allow BIT

然后为每个小时/天组合添加行。

于 2008-12-23T16:42:55.380 回答
1

我之前实际上使用过这种设计,基本上是为您想要定期安排的时间跨度除以您想要的周期数创建一个位图。因此,在您的示例中,您需要一个以小时为单位的周计划,因此您将拥有一个只有 21 个字节长的 168 位位图。几个日期时间加在一起是 16 个字节,您需要其中的多行来表示给定一周的可能时间表,所以如果您完全关心大小,我认为您无法击败它。

我承认它处理起来有点棘手,而且比以前的建议更不灵活。考虑一下,如果您突然想要使用 1/2 小时的时间段,您需要将所有现有数据转码为新的 336 位图并将值分发出去。

如果您使用 SQL,您可以将其存储为二进制博客并进行位旋转以比较您自己是否打开或关闭位,或者您可以将每个位存储为一列。MS SQL Server 支持高达 1024 的标准表或 30k 的宽表,因此您可以轻松地将粒度降至 10 分钟,或者对于 30k 表更精细。

我希望这会增加关于如何完成的一些不同的观点。仅当您担心空间/大小或者您可能有 10 或 100 数百万个时,才真正有必要。

于 2008-12-23T17:05:48.360 回答
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 月的所有日子里进行维护。随心所欲地显示。

于 2008-12-23T17:21:59.357 回答
1

每个提议的解决方案对我都有好处,无论如何,如果您遇到性能和/或表大小问题,我会考虑这个。由于您可能会在时间和您的实体(即服务器)之间建立关系,因此大小将增加 entity_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

您将假设每个缺失的行都意味着服务器已关闭。

如果您需要,您可以考虑为日期列使用 DATE 格式来设置特定日期(即正常运行时间仅为 2013/10/02 16:00 和 20:00 之间)。

希望能帮助到你

于 2013-10-02T10:34:25.507 回答
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
于 2008-12-23T16:32:46.570 回答
0

用 Python 编写,这样的模块可能会工作 - https://github.com/AndrewPashkin/pytempo

于 2015-06-29T20:00:00.137 回答