【问题标题】:SQL attendance database designSQL考勤数据库设计
【发布时间】:2019-11-27 02:37:05
【问题描述】:

我目前正在 mariaDb 中设计一个数据库,该数据库将用于 Meteor 应用程序(包括 orm 的后续),用于跟踪学校学生的出勤率。

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

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

预计起始人数为 20 名教师,250 名学生,500 人/周,(每个学生有两节课)37 周,(最多双倍学生和课程)。

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

学生表上是否有一个每次记录出勤时都会更新的课程计数器字段是个好主意?

非常感谢!

更新:

有可能进行优化吗?这应该是针对学生和教师的可能的电子邮件和发票系统的基础

【问题讨论】:

  • 250 次查询 -- 每天? - 没问题。每秒? - 可能是个问题。

标签: mysql sql database mariadb


【解决方案1】:

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

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

没有。在现代硬件上,查询 20.000 行会很快。如果你有一个不错的索引策略,查询应该在 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)

【讨论】:

  • 谢谢。我的设计大致相同,只有出勤表和缺勤表在一起(并且确实使用外键进行推理)。把它们分开会更好吗?对缺勤进行评估,其中一些算作在场(例如学生没有及时醒来......)。 您的设计有很多可能的改进。我可以给点提示吗?
  • 我已经更新了答案以解释为什么我认为“缺席”和“出勤”是单独的表格。这不是黑白的......我提出的架构是可能的改进 - 你的问题暗示了一些更基本的东西。如果您在问题中包含您的实际架构,您将获得更准确的答案...
  • 感谢您的回答和更新!我已经添加了我的初始设计(剥离)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-17
  • 2015-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多