我目前正在mariaDb中设计一个数据库,该数据库将在Meteor应用程序(全都序列化)中用于跟踪学校学生的出勤情况。
我不确定这是最有效的方法,因为我的案子很少例外:
估计的起始人数为20名教师,250名学生,500名出勤率/周,(每名学生有两节课)37周,(最大人数为两节课和一节课)。
在20000行表上运行250个查询(查找)是否耗时?
在学生表上是否有一个lesson_counter字段,每当记录一次出勤时都会更新该字段?
非常感谢!
更新:
是否有可能要进行优化?这应该是为学生和老师建立可能的电子邮件和发票系统的基础
答案 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)