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