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'

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

确实应该如李园那样建表,建立联系(即两表出现相同字段)

然后通过查询就可以制出任意想要的表,任意想要的东西。

其实sql语言查询的精神就在这里,而不是建很多表来简化查询语句。

不过现在已经建立了表,如果做其他查询时打开表名字可能过长

首先ALL感觉不需要,地名可以简化像江浙沪,年级两个字不用打,

貌似最后重点在记录每天各学校各年级的出勤和活动情况。

所以表名可以就是京某小一操勤 沪某小二活动

建议, 写例子阐述可以用中文字段, 如果是在实际工作中,用语义化的字段或英文字段。
其实,理清楚这个关系结构并不难,就是最常见的关系结构表。
学习sql时老师们讲课经常举的例子:
班级表,教师表,课程表,学生成绩表等的关系是一样的。

其实做数据库设计很简单:
第一步:通过需要实现功能抽象出你会用到的所有实体信息,一个实体信息就是一张表。按照你的想法,大概可以猜出你要实现的主要功能,你在设计的时候考虑欠佳---比如你没有考虑到有些学校可能不是一个年级只有一个班级,可能一个年级会有多个班级,而每一个班级都有班主任和班长。这样灵活性就很不好。
第二步:考虑这些实体之间的关系,比如年级信息和学校信息之间的关联、班级信息与年级信息的关联、考勤信息与班级信息的关联、考勤信息与年级之间的关联等等
*注意:在设计数据库的时候最好全部采用英文命名,并且要考虑冗余问题,最大程度的减少数据库读写操作的压力,特别是当数据库中表数据达到一定大的时候(比如一张表的数据有1G,也就是一张表有大概1500W条数据的时候如何优化)
最后根据你的需求,我帮你设计了一个数据字典,仅供参考:
001
002
003
004
005
这样的设计,不仅可以供现在段使用,在以后想扩充功能的时候也很灵活。

你的回答