什么是出勤数据库的良好数据库设计(架构)?

时间:2010-10-15 05:43:21

标签: mysql database-design

我正在尝试申请保持亲属武术工作室的出勤率。我已经尝试过寻找一些类似的例子,但我找不到任何特定的或足够明确的这类应用程序。

目前,我正在使用两个表,一个用于保存学生信息,一个用于学生(id,first_name,last_name,电子邮件,...),另一个用于一年中出勤的表,出勤率(id, week_1,week_2,week_3,...)。我试图改变它以保持数天的出勤率,但似乎无法想到一个好的方法,因为我仍然是MySQL的新手。

我正在尝试这样做,以便能够以类似日历的格式查看出席情况。仅列出365天的列可能会很糟糕......而且每个月都有一张表。我注意到一些类似的应用程序只是跟踪日期,并将其存储在数据库中。这种方法会更好吗?或者,是否有其他更好的方法来设计这种数据库?提前谢谢。

3 个答案:

答案 0 :(得分:18)

在武术中,教师也是学生 - 所以Instructor表被子类型化为Student表。所有公共字段都在Student表中,并且只有特定于教师的列位于Instructor表中。

Art表有学校提供的艺术清单(柔道,空手道......)。

学校可能有几个房间,这些房间列在Room表中。

ClassSchedule描述了学校提供的课程安排时间表。

Attendance表格中捕获了出席情况。

Calendar表中的一行是一个日历日(日期)。该表格包含DayOfWeekMonthNameMonthNumberInYear等日期属性。

TimeTable中的一行是一天中的一分钟,如7:05。

日历和时间表允许按日期/时间轻松进行出勤报告,例如

-- Attendance of judo morning classes
-- for the first three months of the year 2010
-- by day of a week (Sun, Mon, Tue, ..)
select
    DayOfWeek
  , count(1) as Students
from ClassSchedule as a
join Calendar      as b on b.CalendarId = a.CalendarId
join TimeTable     as c on c.TimeID     = a.StartTimeId
join Attendance    as d on d.ClassId    = a.ClassID
join Art           as e on e.ArtId      = a.ArtID
where ArtName = 'judo'
  and Year    = 2010
  and MonthNumberInYear between 1 and 3
  and PartOfDay = 'morning'
group by DayOfWeek ;

alt text

希望这能让你开始。

答案 1 :(得分:11)

出勤应该有id,student_id和日期。这是学生上学时所需记录的全部内容。如果您想知道有多少学生在特定日期(以及谁)参加了该特定日期或日期范围的查询。

您还可以创建课程表,在这种情况下,考勤表将是 id,student_id和lesson_id 课程表可以是 id,held_on_date

除非您需要在课程表中添加更多列,否则我认为这样做太过分了。

答案 2 :(得分:0)

退一步,你有两种类型的实体:

  • 一个人[像学生]
  • 事件[像一个班级]

将任何实体视为现实世界中存在的东西。

和一个关系

  • 出勤

关系就是这样,实体之间的关联,并且通常具有与其关联的时间数据或其他类型的度量

所以不要太费力,你应该有3个数据库表:

  • 与会者[E]
  • class [E]
  • 出勤[R]

E =实体,R =关系

如果您发现自己在某个实体表中复制了数据,这是一个好的迹象,表明该实体需要一个"子模型"。在某些地方,这被称为“不要重复自己”#34;或DRY和实体关系建模,这被称为"数据规范化"。

请记住,在时间和代码方面都有开销来构建更精细的架构。因此,请考虑启动简单的[3表]并重构冗余。