2013-06-23 24 views
0

我有一張表,其中第一列是指用戶名,其他列是指學生所做的每個科目和他們的每個科目的技能水平。這些科目屬於幾個主要科目流,如數學,藝術等。如何正確標準化表中的數據集?

我將數據標準化爲以下表格。

Subject_Stream

id Main_Stream Subject 
1 Math pure-maths 

2 Math applied-maths 

3 Art Dancing 

4 Art Music 

Student_table

id name subject skill_level 
1 xxx Music 5 
2 xxx Pur-math 4 
3 xxx Applied-math 1 
4 yyy Music 3 



select subjects, skill_level where usename="xxx" order by Desc 

我可以使用類似的查詢來獲取對象和他們的技術水平對於任何給定的學生。

除此之外,我需要選擇學生,當我選擇任何科目或集合的主題,並打印他們的姓名,主題,技能水平降序。

在這裏,任何學生都可以在不同的流中做不同的科目。

但我不能輕易從我現有的表中得到這個結果。如何正確執行此操作? 我是否需要改進數據庫模式?

回答

1

首先,我想爲您的表格結構提出兩個小改進,以更好地標準化數據。你的表Student_table會更好的性能稍微組織如果

  1. 而不是name您從高校學生表參考USER_ID(這意味着學生的名字僅出現在您的高校學生表 - 記住,名稱可以改變, pe婚姻)和
  2. 而不是subject的名稱,因爲您引用了主題的ID - 因此該主題的名稱僅出現在您的表Subject_Stream中。

你的表Student_table然後會是這個樣子:

id user_id subject_id skill_level 
-------------------------------- 
1 1  4   5 
2 1  1   4 
3 1  2   1 
4 2  4   3 

在此基礎上,你應該能夠得到您所描述的每個查詢。有關具體信息,請更新您的問題並添加一些示例,說明您的期望結果如何,然後我會研究它並給出幾個示例。

1

此外,我需要選擇學生時,我選擇任何科目 或收集的科目。並按降序排列他們的名字,科目,技能等級 。

對於單個主題。 。 。

select name, subject, skill_level 
from Student_table 
where subject = 'your subject name' 
order by skill_level desc, name asc 

適用於多個科目。 。 。

select name, subject, skill_level 
from Student_table 
where subject = 'some subject name' 
    or subject = 'some other subject name' 
order by skill_level desc, name asc 

還有其他的方式來表達這種查詢,但我認爲多個OR子句是最容易理解的。

通過流選擇(數學,在這種情況下)。 。 。

select Student_table.name 
    , Student_table.subject 
    , Student_table.skill_level 
    , subject_stream.main_stream 
from Student_table 
inner join subject_stream 
     on subject_stream.subject = student_table.subject 
where subject_stream.main_stream = 'Math' 
order by Student_table.skill_level desc, name asc