Database design 无限周期日历事件的数据库设计

Database design 无限周期日历事件的数据库设计,database-design,calendar,recurring-events,Database Design,Calendar,Recurring Events,从数据库的角度来看,考虑到以下因素,最好的实现/设计是什么: 无限期的重复日历事件(无结束日期)?显然,为每个事件填充数据库记录是没有意义的 创建定期事件后,编辑违反定期规则的单个事件的最佳方法是什么?例如,“每周一上午9:00”,但有一个特定的周一需要在上午10:00开始 很难在完全没有细节的情况下建议对模式进行更改,但这里有一种方法。你所拥有的是一个条目,上面写着“从今天起,会议时间就在这一天的这个时候。” 从计划的第一天1月1日开始,会议于周一上午9点举行。然后,从生效前的周二开始,下周一

从数据库的角度来看,考虑到以下因素,最好的实现/设计是什么:

  • 无限期的重复日历事件(无结束日期)?显然,为每个事件填充数据库记录是没有意义的

  • 创建定期事件后,编辑违反定期规则的单个事件的最佳方法是什么?例如,“每周一上午9:00”,但有一个特定的周一需要在上午10:00开始


  • 很难在完全没有细节的情况下建议对模式进行更改,但这里有一种方法。你所拥有的是一个条目,上面写着“从今天起,会议时间就在这一天的这个时候。”

    从计划的第一天1月1日开始,会议于周一上午9点举行。然后,从生效前的周二开始,下周一(20日)的会议将在上午10点举行。从21日开始,会议时间恢复到上午9点

    完成这项工作的查询看起来有点复杂,但遵循逻辑,应该是显而易见的

    select  Dow "Day of meeting", Time
    from    MeetingSchedule ms
    where   ms.EffDate =(
            select  Max( ms1.EffDate )
            from    MeetingSchedule ms1
            where   ms1.EffDate <= Today()
            );
    
    但在更改会议日期之前,最后一次会议之后的任何日期都将给出正确答案。如果从那时起时间改为上午10点,只需删除最后一行,这会将其恢复为上午9点


    我添加了星期几,但如果您知道会议绝对、始终在星期一举行,则可以将其省略。

    很难在完全没有细节的情况下建议对架构进行更改,但这里有一种方法。你所拥有的是一个条目,上面写着“从今天起,会议时间就在这一天的这个时候。”

    从计划的第一天1月1日开始,会议于周一上午9点举行。然后,从生效前的周二开始,下周一(20日)的会议将在上午10点举行。从21日开始,会议时间恢复到上午9点

    完成这项工作的查询看起来有点复杂,但遵循逻辑,应该是显而易见的

    select  Dow "Day of meeting", Time
    from    MeetingSchedule ms
    where   ms.EffDate =(
            select  Max( ms1.EffDate )
            from    MeetingSchedule ms1
            where   ms1.EffDate <= Today()
            );
    
    但在更改会议日期之前,最后一次会议之后的任何日期都将给出正确答案。如果从那时起时间改为上午10点,只需删除最后一行,这会将其恢复为上午9点

    我增加了一周中的某一天,但是如果你知道会议绝对,总是在星期一,那么你可以省略它

    select  :DateOfInterest "Week starting", Dow "Day of meeting", Time
    from    MeetingSchedule ms
    where   ms.EffDate =(
            select  Max( ms1.EffDate )
            from    MeetingSchedule ms1
            where   ms1.EffDate <= :DateOfInterest
            );
    
    Week starting   Day of meeting Time
       03/05/2017   Mon            0900
       03/12/2017   Mon            0900
       03/19/2017   Mon            1000
       03/26/2017   Mon            0900