mysql数据库结构如何设计?

小弟要做一个东西,记录各种数据
我举例一下:
记录全国学校学生的一些情况,要统计全国的所有学校,就北京小学举例,首先要记录北京小学的建立时间,校长名字,校园地址,学校总人数, 另外,要记录每个年级的同学情况,比如5年级,那么 需要记录5年级每天学生迟到人数,旷课人数,请假人数,[这个数据要每天都按时记录], 另外,要不定时的记录 同学X活动时间,Y活动时间[这些活动不是定时开始的,是随情况变化的,所以可能某天只记录一条数据,某天可能要记录上百 上千 条]

需求大概如此,可能我说的有点乱,我大概设计了下数据库的结构,请大家帮我看看 是否可以优化

data

如果这样设计表名,我打开mysql数据库管理器,就看到一大串以【ALL_北京小学_1年级_活动情况】
这样的格式命名的表,感觉看上去好复杂

当我需要查询,北京小学一年级活动情况的时候我需要:
【select * from ALL_北京小学_1年级_活动情况
总感觉太复杂了

不知道我设计的这个是不是正确,是不是哪里需要优化,请高人指点,谢谢了

另外 求高手回答我这个问题

http://luexiao.com/#!/questions/108434/p108721

4 个回答

按照你的这种设计,假设有N个学校,每个学校有M个年级,那么你就有:
1 张学校表(记录每个学校的信息),N 张年级表(每个学校对应一张年级表,记录该学校的年级信息),N*M 张考勤表(每个学校的每个年级一张表,记录某个学校的某个年级的考情信息),N*M张活动表(每个学校的每个年级一张表,记录某个学校的某个年级的活动信息)

这样确实太复杂了,表太多太多了,即便只有100个学校,每个学校有6个年级,那就有1301张表了。

其实只要4张表就够了:
“学校”表,记录学校信息
“年级”表,记录各个学校的各个年级信息
“考勤”表,记录各个学校各个年级的考勤信息
“活动”表,记录各个学校各个年级的活动信息

"学校" 表
76A449CB038B415CBBDFEAE3102C2C62

"年级" 表
C5C621B0E75C4D5AA20DF5B379195F05字段"school_id"为外键,来自"学校"表的id

"考勤" 表
B8F5A7EB1DA344B28BF5D8747E75F79E字段"grade_id"为外键,来自"年级"表的id

"活动" 表
8162CD8B29294123BEF36CC63172DB2C字段"grade_id"为外键,来自"年级"表的id

以下为常用查询语句:
1、查询名称为“北京小学”学校信息
select * from 学校 where 学校名称 = '北京小学'

2、查询“北京小学”的“1年级”的信息
select * from 年级 left join 学校 on 学校.id = 年级.school_id where 学校.学校名称 = '北京小学' and 年级.年级 = '1年级'

3、查询“北京小学”的“1年级”在“2012-05-01”日的活动考勤情况
select * from 考勤 left join 年级 on 年级.id = 考勤.grade_id left join 学校 on 学校.id = 年级.school_id where 学校.学校名称 = '北京小学' and 年级.年级 = '1年级' and 考勤.时间 = '2012-05-01'

4、查询“北京小学”的“1年级”在“2012-05-01”日的活动活动情况
select * from 活动 left join 年级 on 年级.id = 活动.grade_id left join 学校 on 学校.id = 年级.school_id where 学校.学校名称 = '北京小学' and 年级.年级 = '1年级' and 活动.时间 = '2012-05-01'

当然,你也可以在“年级”表中加一个“学校名称”的冗余字段,这样查询某个学校的年级信息时就不用关联“学校”表了,同样也可以在“考勤”表和“活动”表里加个“年级”、“学校名称”冗余字段