Mysql数据库方法对学生,班级,年级推广

时间:2012-09-28 13:17:03

标签: mysql database

我对以下情况下如何查看我的Mysql数据库感到困惑,尽管我研究了其他一些解决方案。

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

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

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分:0)

如果有可能的话,我喜欢到处都有明确的数据。例如,我将创建单独的等级(5,6,7,8等)和等级id(A,B,C等)字段。这有很多好处。例如:

  • 查询所有五年级课程不会导致像SELECT * FROM table WHERE grade LIKE "5%";那样的范围查询。
  • 同样的事情:您可以轻松查询所有“B”类而无需进行全面扫描(假设您拥有正确的索引)

其他事情是每年课程增加。 5B变为6B然后变为7B。所以这很难找到你正在寻找的课程。我会在现场创建一个开始。找到2006年开始的类“B”是简单明了的(再次显式的东西:))

我的建议是:

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;