2012-09-28 39 views
0

虽然我研究了一些关于这个主题的其他解决方案,但我对如何处理我的Mysql数据库感到困惑。关于学生,班级,等级升级的Mysql数据库方法

在一所学校里,孩子们被分成班级。例如,最小的班级是五年级,第二班是第六班,以此类推,最后一班是第八班。每个班级有大约20名学生,并且由于每个年级的学生人数约为100人,因此会形成几个班级,并使用标识符来唯一标识一个班级(例如:5年级班级:5A,5B,5C,5D, 5E)。每年,班级都会晋升到下一个增量成绩。所以第5节课变成第6节,依此类推。

请帮我一个数据库设计的想法/提示。

回答

0

为学生(学生)创建一个表格,为班级(Classes)创建一个表格,并将其关联到... classId上。该分数不会成为该表中的主键,因此当年份过去时,您可以通过更改classId来更新分数。

mysql> create table Classes (classId int, grade varchar(5), primary key(classId)); 
Query OK, 0 rows affected (0.00 sec) 

mysql> create table Students (studentId int, name varchar(30), classId int, primary key(studentId), foreign key (classId) references Classes(classId)); 
Query OK, 0 rows affected (0.01 sec) 
0

如果可能的话,我喜欢所有的显式数据。例如,我会创建单独的等级(5,6,7,8等)和等级ID(A,B,C等)字段。这有很多好处。例如:

  • 查询所有五年级班级不会导致范围查询,如SELECT * FROM table WHERE grade LIKE "5%";会。
  • 同样的事情:你可以很容易地查询所有的“B”类,而全扫描(假设你有正确的索引)

另一件事是在每年的类增量。 5B变为6B然后是7B。所以这很难找到你要找的课程。我会在现场创建一个开始。找到类“B”于2006年开始是容易的,明确的(再次明确的东西:))

我的建议是:

CREATE TABLE school_class (
id smallint unsigned NOT NULL AUTO_INCREMENT, 
start_in smallint unsigned NOT NULL, 
grade tinyint unsigned NOT NULL, 
grade_id CHAR(1), 
PRIMARY KEY (id) 
) ENGINE=InnoDB; 

CREATE TABLE student (
id mediumint unsigned NOT NULL AUTO_INCREMENT, 
class_id smallint unsigned NOT NULL, 
name VARCHAR(255), 
PRIMARY KEY (id), 
FOREIGN KEY (class_id) references school_class(id) 
) ENGINE=InnoDB; 
+0

海事组织,一所学校(?1000名学生)的最佳化可能是不值得,除非OP的一些报告要求非常复杂。 '数据库在全国范围内管理所有学校的好主意,尽管有数百万名学生'---)' – halfer