代码之家  ›  专栏  ›  技术社区  ›  hugoware

每周计划-如何将其存储在数据库中?

  •  9
  • hugoware  · 技术社区  · 17 年前

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

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

    要将其可视化,它类似于流动的“图形”

        | 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. 使其在数据库中可搜索(例如,不必反序列化以搜索一段时间)

    [更新]

    值得一提的是,即使不太可能,一天也可以设置为“允许、拒绝、允许、拒绝……等等”。跨度不能保证是全天唯一的跨度。

    这也不是唯一的时间表,将有数百个设备,每个都有自己的时间表,所以它会变得毛茸茸的。。。英雄联盟

    抢劫 当被问及是否每周都需要跟踪时,答案是否定的。这是一个适用于全年的通用计划(定期维护)

    7 回复  |  直到 17 年前
        1
  •  12
  •   Adam Bellaire    17 年前

    我将考虑(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 表示要检查的日期和时间)。

    每周每一天的允许或不允许将由单独的记录处理。IMHO,对于一周中的每一天,这比硬编码更灵活,因为您将使用某种case语句或if-else切换来检查您感兴趣的那一天的正确DB列。

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

        2
  •  2
  •   Rob Prouse    17 年前

    如果每周都不一样,那么就这样摆桌子;

    TABLE:
        StartTime DATETIME    PrimaryKey
    

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

    如果这是一个普通周的普通配置,没有改变,试试这个;

    TABLE:
        Hour  INT,
        Day   INT,
        Allow BIT
    

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

        3
  •  1
  •   Peter Oehlert    17 年前

    我以前确实使用过这种设计,基本上是为你想要定期安排的时间跨度除以你想要的周期数创建一个位图。因此,在您的示例中,您需要一个带有小时周期的周计划,因此您将有一个只有21字节长的168位位图。一对datetimes总共是16个字节,您需要多行这些数据来表示给定一周的可能日程安排,因此如果您关心大小,我认为您无法超越它。

    我承认,与以前的建议相比,处理这个问题有点棘手,也没有那么灵活。考虑一下,如果你突然想要使用1/2个小时的时间段,你需要将所有现有的数据转换成新的336位位图并分发值。

    如果您使用的是SQL,您可以将其存储为二进制日志,并进行位旋转以比较位是打开还是关闭,或者可以将每个位存储为列。MS SQL Server支持高达1024的标准表或30k的宽表,因此您可以轻松地将其中一个表的粒度降低到10分钟,或将30k表的粒度细化很多。

    我希望这能为如何做到这一点增加一点不同的视角。只有当你担心空间/大小,或者你可能有10到100个百万的空间/大小时,才有必要这样做。

        4
  •  1
  •   Kloran27 Kloran27    17 年前

    您可以轻松地在表中记录“允许”的时间。这样,如果它不在那里,它是不允许的。如果您需要一个更可变的“时间表”,您可以轻松地添加一个年和月字段。

     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月所有可以执行维护的天数。你想怎么显示就怎么显示。

        5
  •  1
  •   brazorf    12 年前

    每一个建议的解决方案对我都是好的,无论如何,我会考虑这一个你应该面对性能和/或表大小的问题。由于您可能会在时间和您的实体(即服务器)之间建立关系,因此大小将增加实体数*实体数倍。如果你每次都要吵架,这可能会很痛苦。

    该方案在表结构方面稍显丑陋,但在磁盘空间和表扫描速度方面效率更高。

    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
    

    您将假定每一行缺失都意味着服务器已关闭。

    如果你需要这个,你可以考虑使用DATA列的日期格式来设置特定的日期(即16:00和20:00之间的正常时间只有2013/10 / 02)。

    希望能有帮助

        6
  •  0
  •   kemiller2002    17 年前

    也许像

    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
    
        7
  •  0
  •   Devang    11 年前

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