SQL考勤数据库设计

时间:2019-07-18 08:02:35

标签: mysql sql database mariadb

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

enter image description here

我不确定这是最有效的方法,因为我的案子很少例外:

  1. 老师可以根据需要移动和重新安排他们的时间表,并且由于学生为每节课(以及某些缺勤类型)付费,因此我不能使用“排除方式”(例如,仅记录缺勤情况,因此没有记录) =存在)
  2. 最重要的查询是每个学生的出勤率,每次为每个学生打开我的应用程序时,我都需要查询。
  3. 第二重要的是每个老师每月的出勤率。 (这是按需提供的)
  4. (与数据库无关),我需要按10人一组的方式跟踪学生的状态(每节课他们都需要再次支付)

估计的起始人数为20名教师,250名学生,500名出勤率/周,(每名学生有两节课)37周,(最大人数为两节课和一节课)。

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

在学生表上是否有一个lesson_counter字段,每当记录一次出勤时都会更新该字段?

非常感谢!

更新:

是否有可能要进行优化?这应该是为学生和老师建立可能的电子邮件和发票系统的基础

1 个答案:

答案 0 :(得分:0)

您的设计有许多可能的改进。让我首先回答您的特定问题:

  

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

不。在现代硬件上,查询20.000行将很快。如果您采用了不错的索引策略,则查询应在10毫秒内返回。

  

在学生表上具有一个lesson_counter字段,该字段已更新   每次记录出席者的好主意?

否,这不是一个好主意-假设您想为每位学生提供一份报告,显示他们上课或缺课的时间,则无论如何都必须存储该数据。保持计数器就是复制该信息。

我建议如下设计。

从逻辑上讲,“出勤”和“缺勤”是分开的;您可以在带有标记的单个表格中对它们进行建模。我将它们分别建模,因为我将它们视为业务领域中的不同事物,具有不同的属性(缺少原因代码)和潜在的不同行为(例如,缺失可能具有用于发送电子邮件的工作流)。我更喜欢将逻辑上分开的东西放在单独的表中。

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)