0

尽管我研究了有关该主题的其他一些解决方案,但我对如何在以下情况下使用 Mysql 数据库感到困惑。

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

请帮助我提供数据库设计理念/提示。

4

2 回答 2

0

为学生(学生)创建一张表,为班级(班级)创建一张表,并将它们链接到say ... 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)
于 2012-09-28T13:37:21.917 回答
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;
于 2012-09-28T15:21:47.720 回答