Mysql SQL考勤数据库设计

Mysql SQL考勤数据库设计,mysql,sql,database,mariadb,Mysql,Sql,Database,Mariadb,我目前正在mariaDb中设计一个数据库,该数据库将用于Meteor应用程序(woth sequelize orm),用于跟踪学校学生的出勤情况 我不确定哪种方法最有效,因为我的案例中很少有例外: 教师可以随意移动和重组他们的时间表,而且因为学生为每节课(以及某些类型的缺课)付费,我不能使用“排除方式”(例如只记录缺课,所以没有记录=出席) 需要的最重要的查询是每个学生的出勤率,我需要在每次为每个学生打开应用程序时都提供该查询 第二个最重要的是每个教师每月的出勤率。(这是按需提供的) (与db

我目前正在mariaDb中设计一个数据库,该数据库将用于Meteor应用程序(woth sequelize orm),用于跟踪学校学生的出勤情况

我不确定哪种方法最有效,因为我的案例中很少有例外:

  • 教师可以随意移动和重组他们的时间表,而且因为学生为每节课(以及某些类型的缺课)付费,我不能使用“排除方式”(例如只记录缺课,所以没有记录=出席)
  • 需要的最重要的查询是每个学生的出勤率,我需要在每次为每个学生打开应用程序时都提供该查询
  • 第二个最重要的是每个教师每月的出勤率。(这是按需提供的)
  • (与db无关)我需要按10人一组跟踪学生的出席情况(他们必须再次支付的每节课)
  • 预计起始人数为20名教师、250名学生、每周500人次(每个学生有两节课)37周(最大人数为学生和课程的两倍)

    在20000行表上运行250个查询(查找)是否耗时

    在学生桌上有一个每次记录出勤时都会更新的lesson_计数器字段是一个好主意吗

    非常感谢

    更新:


    是否有可能进行优化?这应该是面向学生和教师的电子邮件和发票系统的基础。您的设计有许多可能的改进。让我首先回答你的具体问题:

    在20000行表上运行250个查询(查找)是否耗时

    不。在现代硬件上,查询20000行将会很快。如果您有一个合适的索引策略,查询应该在10毫秒内返回

    在学生桌上有一个更新的课程计数器字段 每次记录出席情况都是个好主意

    不,这不是一个好主意——假设你想让每个学生都有一份报告,说明他们上课或缺课的时间,你就必须存储这些数据。保留一个计数器就是复制那个信息

    我建议采用如下设计

    “出席”和“缺席”在逻辑上是分开的;可以在带有标志的单个表中对它们进行建模。我对它们分别进行了建模,因为我认为它们在业务领域中是不同的东西,具有不同的属性(缺勤有原因代码),并且可能有不同的行为(例如,缺勤可能有发送电子邮件的工作流)。我更喜欢把逻辑上分开的东西放在不同的表中

    Student
    -------
    student_id
    name
    ...
    
    Lesson
    ------
    lesson_id
    subject
    teacher_id (if only one teacher can teach a lesson)
    ....
    
    enrollment
    ---------
    lesson_id
    student_id
    start_datetime (or you might have the concept of "term")
    end_datetime
    
    lesson_session
    -------
    lesson_session_id
    lesson_id
    start_datetime
    end_datetime
    location
    teacher_id (in case more than one teacher can teach a lesson)
    
    
    attendance
    --------
    lesson_session_id
    student_id
    
    absence
    ------------
    lesson_session_id
    student_id
    reason (or might be a foreign key to reasons table)
    

    非常感谢。我的设计大致相同,只有出勤表和缺勤表在一起(原因确实是外键)。把他们分开好吗?对缺勤情况进行评估,其中一些被视为存在(如学生没有及时醒来…)。您的设计有许多可能的改进。我可以给你一个提示吗?我已经更新了答案来解释为什么我认为“缺勤”和“出勤”是分开的。这不是白纸黑字……我提出的模式是可能的改进——你的问题提出了一些更基本的建议。如果你在问题中包含你的实际模式,你会得到更准确的答案…谢谢你的回答和更新!我已经添加了我的初始设计(剥离)250个查询——每天没问题。每秒?-这可能是个问题。