2010-01-08 86 views
2

我正在嘗試創建一個數據庫,用於存儲每個家庭作業的學生成績,我希望能夠存儲成績以及該學生獲得certin成績的次數,例如學生獲得了A+ 30 times ,每個學生的年級,以及學生的成績等級。一個檔次的值是多少,例如A is worth 4.3MySQL評級數據庫結構

所以我想知道什麼是建立我的MySQL數據庫的最佳方式我需要添加什麼,我需要放棄什麼以及如何存儲數字,例如4.3

我的數據庫輸出到目前爲止

CREATE TABLE grades (
id INT UNSIGNED NOT NULL AUTO_INCREMENT, 
grade INT UNSIGNED NOT NULL, 
student_work_id INT UNSIGNED NOT NULL, 
student_id INT UNSIGNED NOT NULL, 
date_created DATETIME NOT NULL, 
PRIMARY KEY (id) 
); 

CREATE TABLE work (
id INT UNSIGNED NOT NULL AUTO_INCREMENT, 
student_id INT UNSIGNED NOT NULL, 
title TEXT NOT NULL, 
content LONGTEXT NOT NULL, 
PRIMARY KEY (id) 
); 

CREATE TABLE IF NOT EXISTS student (
id int(8) NOT NULL auto_increment, 
student varchar(20) NOT NULL, 
PRIMARY KEY (`id`) 
) 

例子。

student | grade | count 

    1  A   10 
    1  C   2 
    1  F   4 
    2  B   20 
    2  B-   3 
    2  C+   10 


student | grade | points 

    1  A   4.3 
    2  B+   3.3 
    3  B-   2.7 
    4  D+   1.3 


student | total grades 

    1  90 
    2  80 
    3  100 
    4  1 

回答

1

很多人會建議你有一個學生表,等級表和涉及學生和等級表的一個表格。然後,您可以根據將兩者與程序關聯的表格進行計數。許多人認爲,在同一個表中有一個年級和一個學生是糟糕的關係設計。

+0

我確實有一張學生表和年級表以及一張將他們兩者聯繫起來的表格。 – teach 2010-01-08 02:11:25

+0

那麼我的桌子應該怎麼樣呢? – teach 2010-01-08 02:13:07

+0

基本數據: 學生表{id,name,<其他人口統計數據} 年級表{id,grade,fk_points} 關係表{id,fk_student,fk_grade} Point Table {id,point } – decompiled 2010-01-08 02:31:59

1

除非你想使用一個視圖,在這種情況下真的不是必需的,否則你不會存儲學生獲得某個等級的次數;相反,當你需要的時候,你會做一個查詢給你每個學生的信息。使用當前的模式,其中一個例子,告訴你多少次ID爲st_id了每個年級一個特殊的學生,會像

SELECT COUNT(1) FROM grades WHERE student_id = st_id GROUP BY grade

這會看看那裏的學生st_id得到了各等級和計數所有行他們分開。

只要存儲從字母等級到其值的點數的映射,您可以執行以下兩件事之一 - 要麼具有從字母等級到點數量的表格映射,要麼直接存儲點數量。就我個人而言,我認爲前者更清潔一點,因爲它允許您在比例變化時更改積分量(而不是經常發生這種情況)。

除此之外,我認爲你做得很好。我要說的唯一的事情是,如果在等級和工作之間始終存在一對一的映射關係,我可能會將工作表的成績納入工作表,而不是將其分開。也就是說,只有在等級表中沒有不屬於工作表的信息的情況下。

2

我認爲學生成績分配模式可以。您應該通過查詢來計算學生的成績數量,而不是在數據庫中維護這些信息。 在概念層面(不是嚴格的mysql),我會做這樣的事情。

table student (
    id int (primary key) 
    varchar name 
    ...       // other student attributes (e.g. phone number) 
) 

table grade (
    id int (primary key) 
    name varchar     // e.g. "A+", "B-", etc. 
    float points     // grade value in points 
) 

table assignment (
    id int (primary key) 
    name varchar     // assignment name 
    student_id int (foreign key) // student that completed the particular assignment 
    grade_id int (foreign key) // grade achieved in particular assignment 
    ...       // other assignment attributes (e.g. due date) 
) 
1

看看你的表,看起來有一些規範化,你可以做,或者我可能會誤解客觀。我假設學生和工作項目只有一個等級相關,這會使您的成績基本上成爲一個交叉參考表。因此,您不會在工作表中引用student_id列。即興,我要改變它使得表看上去就像這樣:

CREATE TABLE student (
student_id int(8) NOT NULL auto_increment, 
student varchar(20) NOT NULL, 
PRIMARY KEY (student_id) 
); 

CREATE TABLE work (
work_id INT UNSIGNED NOT NULL AUTO_INCREMENT, 
title TEXT NOT NULL, 
content LONGTEXT NOT NULL, 
PRIMARY KEY (work_id) 
); 

CREATE TABLE grades (
grade_id INT UNSIGNED NOT NULL AUTO_INCREMENT, 
grade decimal(4,2) UNSIGNED NOT NULL, 
work_id INT UNSIGNED NOT NULL, 
student_id INT UNSIGNED NOT NULL, 
date_created DATETIME NOT NULL, 
PRIMARY KEY (id) 
); 

注意,我改變了列級爲十進制(我是一個SQL Server的傢伙,因此MySQL可能會有所不同),但任何可以處理非整數數字的類型都可以工作。通過這種設計,您可以根據需要提取查詢以獲取所需的輸出類型。

喬希

+0

有趣,因爲我會走另一條路。通過工作讓學生通過工作評分對我來說更直接(事實上,在工作分級之前在你的模式中發生了什麼),但我必須說,多年的面向對象已經枯萎了我的能力關係思維。 – CurtainDog 2010-01-08 04:05:01

1

假設 -

  1. 有不止一個學生

  2. 有不止一個分配/件工作要針對

  3. 多個學生分級可以完成一套具體的工作/任務
  4. 只有一個年級可以賺取編按分配

我一起去 -

  1. 表中每一套作品/特定任務的定義。

  2. 一個表來定義每個學生

  3. 第三個表來記錄每個學生每次分配的結果,即存儲每個分配檔次。

如 -

CREATE TABLE work (
id   INT UNSIGNED NOT NULL AUTO_INCREMENT, 
student_id INT UNSIGNED NOT NULL, 
assignment_id int unsigned not null, 
grade   DECIMAL(1,1) 
gradedesc  VARCHAR(1) 
PRIMARY KEY (id) 
); 

CREATE TABLE IF NOT EXISTS student (
id  int(8) NOT NULL auto_increment, 
student varchar(20) NOT NULL 
PRIMARY KEY (`id`) 
) 


Create table assignment (
id   int(8) not null auto_increment, 
title  TEXT NOT NULL, 
content LONGTEXT NOT NULL 
primary key(id) 

然後,創建一些看法,以顯示你想要的格式輸出,如 -

Create view graded_students as 
(select s.student, 
     w.gradedesc as grade, 
     w.grade as points, 
     w.title 
from work w, 
    student s 
where w.student_id = s.id 
and w.grade is not null) 

Create view aggregate_grades as 
(select s.student, 
     sum(w.grade) as "total grades", 
from work w, 
    student s 
where w.student_id = s.id 
and w.grade is not null 
group by s.student) 

create view grades_by_assignment as 
(select s.student, 
     a.title, 
     w.gradedesc as grade 
from student s, 
    work w, 
    assignment a 
where a.id = w.assignment_id 
and s.id = w.student_id) 

我更多的Oracle和SQL Server的人,所以這可能不是100%符合mysql(我沒有測試過),但類似的東西會做我的想法。

如果您想進一步標準化數據,也可以將等級描述/值分解到另一個表中,或者僅根據存儲的值在應用程序中顯示等級描述(例如等級值4.5始終顯示爲「 A「等)