2012-09-28 1 views
0

다음과 같은 경우에 MySQL 데이터베이스에 대한 정보를 얻는 방법에 대해 혼란 스럽습니다.학생, 학급, 학년 승진에 대한 MySQL 데이터베이스 접근법

학교에서 아이들은 수업으로 그룹화됩니다. 예를 들어, 가장 작은 클래스는 5 학년이고, 두 번째 클래스는 6 번째이며, 계속해서 마지막 클래스는 8 번째 클래스입니다. 각 반에는 약 20 명의 학생이 있으며, 각 학년마다 학생 수가 약 100 명이기 때문에 여러 클래스가 형성되고 클래스를 고유하게 식별하는 데 식별자가 사용됩니다 (예 : 5 학년 클래스 : 5A, 5B, 5C, 5D, 5E). 매년 수업은 다음 단계로 향상됩니다. 따라서 5th 클래스는 6th가됩니다.

데이터베이스 설계 아이디어/힌트를 도와주세요.

답변

0

학생 (학생)을위한 하나의 테이블을 만들고 클래스 (클래스)를위한 하나의 테이블을 만들고 ... classId에 연결하십시오. 등급은 해당 테이블의 기본 키가 아니므로 1 년이 지나면 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 등) 필드를 만들 것입니다. 이것은 많은 이점을 가지고 있습니다. 예를 들면 다음과 같습니다.

  • 모든 5 학년 클래스를 쿼리해도 SELECT * FROM table WHERE grade LIKE "5%";과 같은 범위 쿼리가 생성되지 않습니다.
  • 같은 일이 : 당신은 쉽게

다른 점은 매년의 해당 클래스의 증가이다 (당신이 바로 인덱스가 가정) 전체 검사없이 모든 "B"클래스를 조회 할 수 있습니다. 5B가 6B 이후 7B가된다. 그래서 이것은 당신이 찾고있는 수업을 찾기가 매우 어렵습니다. 나는 현장에서 시작을 만들 것입니다.

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 명 학생)에 최적화가 아마 2006 년에 시작 클래스 "B"를 찾기 (다시 명시 적으로 물건 :))

내 추천 것 쉽고 명시 적입니다 OP의보고 요구 사항 중 일부가 매우 복잡하지 않는 한 그만한 가치는 없습니다. 수백만 명의 학생들이 국가 수준에서 모든 학교를 관리하는 데이터베이스에 대한 좋은 아이디어';-)' – halfer

관련 문제