2010-10-15 111 views
9

我正在试着申请一个亲戚的武术工作室。我尝试过寻找一些类似的例子,但是我找不到任何具体的或足够清晰的例子。什么是考勤数据库的优秀数据库设计(模式)?

目前,我使用两个表格,一个用于保存学生信息,学生(id,first_name,last_name,email,...),另一个表格用于出席一周的一周,出勤(id ,week_1,week_2,week_3,...)。我试图改变它,以保持出席数天,但似乎无法想到一个好方法,因为我还是一个MySQL的新手。

我想使它能够以类似日历的格式查看出席情况。在365天内制作专栏可能会很糟糕......并且每个月都有一张表格。我注意到一些类似的应用程序只是跟踪日期,并将其存储在数据库中。这种方法会更好吗?或者,还有其他更好的方法来设计这种类型的数据库吗?提前致谢。

回答

5

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

您还可以创建一个教训表,在这种情况下,考勤表是 ID,student_id数据和lesson_id 课程表可以 ID,held_on_date

,除非你需要添加更多的列到的教训表,我认为这是矫枉过正。

+0

您的回答和Damir的回答已经回答了我所有的问题。感谢您的帮助。 – 2010-10-16 00:49:59

14

在武术中,导师也是学生 - 所以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

希望这可以让你开始。

+2

日期表是一种数据存储技术。对于一个自称是mySQL新手的人来说,这可能会让人感到困惑。强烈建议不要使用日历维度,而正常的日期列在事务数据库中会很好。 – 2010-10-15 15:56:42

+2

还有一个时间维度......你究竟想要做这个新手呢? – 2010-10-15 15:59:14

+2

@Stephanie - 那么,你对丹尼尔有多了解,以及你认为他无法理解这一点? – 2010-10-15 16:27:05

0

步后退了一点,有两种类型的实体:

  • 人[像个学生]:
  • 事件[如类]

认为任何实体的东西的存在于现实世界中。

而一个关系

  • 出席

的关系就是这样,实体之间的关联,并经常有时间,或其他类型的措施相关数据。

所以想也没想太辛苦,你应该有3个数据库表:

  • 与会者[E]
  • 类[E]
  • 出席[R]

E =实体,R =关系

如果您发现自己在其中一个实体表中复制数据,这是一个好兆头,实体需要一个“子模型”。在一些地方称为“不要重复自己”或DRY,而对于实体关系建模,这称为“数据标准化”。

请记住,构建更精细的模式在时间和代码上都有开销。所以考虑启动简单的[3个表]并重构冗余。