如何正确地将数据集规范化到表中?

时间:2013-06-23 17:30:45

标签: mysql normalization

我有一张表,其中第一列引用用户名,其他列引用学生所做的每个科目以及每个科目的技能水平。这些科目属于数学,艺术等几个主要科目。

我将数据规范化为以下表格。

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

我可以使用类似的查询来获得任何特定学生的科目及其技能水平。

除此之外,我需要在选择任何科目或科目集合时选择学生。并按降序打印他们的姓名,科目,技能水平。

这里任何一个学生也可以在不同的流程中做不同的科目。

但是我不能轻易从现有表中获得此结果。怎么做到这一点? 我是否需要改进数据库架构?

2 个答案:

答案 0 :(得分:1)

首先,我想建议对表结构进行两项小改进,以便更好地规范化数据。如果

,您的表格Student_table将会更好地组织
  1. 而不是name你引用了studends-table中的user_id(这意味着学生的名字只出现在你的studends-table中 - 记住,名字可以改变,例如婚姻)和
  2. 而不是您引用主题ID的subject的名称 - 因此主题的名称仅出现在您的表Subject_Stream中。
  3. 您的表格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 :(得分: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子句。

按流选择(在本例中为Math)。 。

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