【问题标题】:How to handle calendar appointments in MariaDB如何在 MariaDB 中处理日历约会
【发布时间】:2021-01-07 08:55:21
【问题描述】:

我正在使用数据库 (MariaDB) 来支持 PHP 驱动的学校课程日历。我有一个表,Class,其中存储了课程的开始时间和持续时间。我还有另一个表,Teacher,它存储教师信息。一个班级只会分配一位老师,而且课程总是按时开始。

我想确保当她/他正在上另一堂课时,不会为某位老师预订新课程。如果课程只有一小时,我会简单地对 TeacherClass 实施 UNIQUE 约束,但由于课程可能超过一小时,我不确定如何来解决这个问题。

当然,我可以在 INSERT 之前对 PHP 进行检查,但我认为设计数据库以使任何一位教师的课程都不可能重叠是更好的做法。我看过 SQL 过程,但我不熟悉它们的用法,而且我还没有找到一个示例来接近我需要在这里执行的那种检查。

谁能建议如何最好地解决这个问题?

【问题讨论】:

    标签: php sql database-design mariadb


    【解决方案1】:

    使用时间段(15 分钟)将教师和班级都标记为忙碌。

    -- Teacher TCH exists.
    --
    teacher {TCH}
         PK {TCH}
    
    -- Class CLS exists.
    --
    class {CLS}
       PK {CLS}
    
    -- Time slot number SLT, starting at STA is 15 min long.
    --
    tslot {SLT, STA}
       PK {SLT}
    
    
    -- data sample
      (SLT, STA)
    ---------------
      (1, '00:00')
    , (2, '00:15')
    , (3, '00:30')
    , (4, '00:45')
    , (5, '01:00')
    -- ...
    , (95, '23:30')
    , (96, '23:45')
    
    -- This is a "static" table, once populated make it read-only.
    

    从应用程序级别,填充此表中的所有槽 基于教师、班级、开始时间和给定日期的结束时间。 确保它是在事务中完成的,因此错误会回滚所有内容。

    -- On date DTE, teacher TCH is busy with class CLS
    -- during time slot number SLT.
    --
    busy {DTE, SLT, TCH, CLS}
      PK {DTE, SLT, TCH}
      AK {DTE, SLT, CLS}
    
    FK1 {SLT} REFERENCES tslot   {SLT}
    FK2 {TCH} REFERENCES teacher {TCH}
    FK3 {CLS} REFERENCES class   {CLS}
    

    注意:

    All attributes (columns) NOT NULL
    
    PK = Primary Key
    AK = Alternate Key   (Unique)
    FK = Foreign Key
    

    这远非完美,它可能会被随机更新搞砸,比如在课堂中间的某个位置更换老师。因此,应用程序应该强制执行规则以防止出现奇怪的条目。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多