2012-09-28 74 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