Mysql 考勤数据库的良好数据库设计(模式)是什么?

Mysql 考勤数据库的良好数据库设计(模式)是什么?,mysql,database-design,Mysql,Database Design,我想申请参加一个亲戚的武术工作室。我试着四处寻找一些类似的例子,但我找不到任何适合这种应用的具体或足够清晰的例子 目前,我正在使用两个表,一个用于保存学生信息,即学生(id、姓、名、电子邮件等),另一个表用于记录一年中的周出勤率(id、周出勤率1、周出勤率2、周出勤率3等)。我正试图将其改为以天为单位保持出席率,但似乎无法想出一个好方法,因为我对MySQL还是有点陌生 我正在努力做到这一点,以便能够以类似日历的格式查看出席情况。如果只做365天的专栏可能会很糟糕。。。每个月都有一张桌子。我注意到

我想申请参加一个亲戚的武术工作室。我试着四处寻找一些类似的例子,但我找不到任何适合这种应用的具体或足够清晰的例子

目前,我正在使用两个表,一个用于保存学生信息,即学生(id、姓、名、电子邮件等),另一个表用于记录一年中的周出勤率(id、周出勤率1、周出勤率2、周出勤率3等)。我正试图将其改为以天为单位保持出席率,但似乎无法想出一个好方法,因为我对MySQL还是有点陌生


我正在努力做到这一点,以便能够以类似日历的格式查看出席情况。如果只做365天的专栏可能会很糟糕。。。每个月都有一张桌子。我注意到一些类似的应用程序只是跟踪日期,并将其存储在数据库中。这种方法会更好吗?或者,还有其他更好的方法来设计这种数据库吗?提前感谢。

出席者应具有身份证、学生证和日期。这就是学生上课时需要记录的全部内容。如果您想知道在某个特定日期有多少学生(以及谁)参加了培训,请针对该特定日期或日期范围运行查询

您还可以创建一个课程表,在这种情况下,考勤表将是 id、学生id和课程id 课程表可以是 身份证,于年月日持有


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

在武术中,教练也是学生——因此
教练
表是
学生
表的子类型。所有公共字段都在
学生
表中,只有特定于讲师的列在
讲师
表中

艺术
表格列出了学校提供的艺术(柔道、空手道……)

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

ClassSchedule
描述学校发布的课程表

考勤记录在
考勤
表中

日历表中的一行是一个日历日(日期)。该表具有日期属性,如
DayOfWeek
MonthName
MonthNumberInYear

时间表中的一行是一天中的一分钟,如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 ;


希望这能让您开始。

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

  • 一个人[像一个学生]
  • 事件[像一节课]
把任何实体想象成存在于现实世界中的东西

还有一种关系

  • 出席
关系就是实体之间的关联,通常具有与其关联的时间数据或其他类型的度量

因此,不用想太多,您应该有3个数据库表:

  • 与会者[E]
  • 类别[E]
  • 出席人数[R]
E=实体,R=关系

如果您发现自己在其中一个实体表中复制数据,这表明该实体需要一个“子模型”。在某些地方,这被称为“不要重复自己”或DRY,对于实体关系建模,这被称为“数据规范化”


记住,构建更复杂的模式在时间和代码上都有开销。因此,考虑开始简单的[ 3个表]和重构冗余。

日期表是数据存储技术。对于一个对mySQL非常陌生的人来说,这可能非常令人困惑。我强烈建议不要使用日历维度,因为在事务数据库中使用普通的日期列就可以了。。。你到底想对这个新手做什么?@Stephanie--那么,你对Daniel了解多少?是什么让你认为他不能理解这些?@Stephanie--没错,datetime列在
ClassSchedule
表中就可以了。使用
日历
时间表
只是从查询的WHERE子句中删除日期和时间函数的一种技术,yes在数据仓库中经常使用。@Deepak和。。。?该表的1000万行约为0.2GB(包括索引)。您的答案和Damir的答案回答了我所有的问题。感谢您的帮助。如果我创建一个表,其中日期、月份和年份列为1-31整数列,特定类的类/讲座为1-31整数列。并为每个月创建一个。这将是一个好主意?有什么比这更好,还有像MySQL或MongoDB这样的RDBMS系统,为什么?