1

我只对数据库设计和 SQL 有一点了解。我为学习编程和数据库编写了一个简单的学生分数管理器,但我的设计很糟糕。

数据库结构

我的数据库有三个表:

  1. 学生信息
  2. 日志
  3. 星期

先来说说吧student_info。这个表结构就像这样:

id  student_name    group    the_score_for_1_week    the_score_for_2_week
1   Adam            2        24                      2

字段数未知。

logs很乱:

id  date    student_name    score   change  week
1   01-01   Adam            2       2       1
2   01-02   Adam            1       -1      1
2   01-02   Adam            24      23      1

week只有 1 个字段。

week
2

程序

在我展示了数据库的结构之后。我要谈谈我的程序是如何工作的。

它看起来怎么样?

该程序有两个网格,一个图表,三个按钮。第一个网格用于学生姓名和分数。第二个网格是日志,我们可以看到分数是如何变化的。该图表也用于显示分数的变化。这是我的第一个蓝图。

蓝图

当用户用鼠标点击第一个图表上的学生姓名时,第二个图表会显示该学生的成绩日志,该图表会显示该学生成绩的折线图。

该程序可以为不同的周保存不同的分数。所以,它有三个按钮:Last Week, Next Week, New Week我们只能编辑最近一周。

它是如何工作的

当程序启动时,它将从 中选择最近的一周week

SELECT week FROM week

然后从 中选择, student_name,group最近一周student_info。我们可以加/减学生的分数。

"SELECT student_name,the_score_for_%s_week,group FROM student_info" % (week)

分数更改后,将向logs表中插入一条记录。

"INSERT INTO log(change,score,date,student_name,week) VALUES ("
                 "'%s', '%s', '%s', '%s', '%s')" % (
                 newScore - oldScore, newScore,
                 time.strftime("%m-%d", time.localtime()),
                 student, week))

当新的一周开始时,the_score_for_%d_week将插入一个新字段student_info,我们还需要更新week表。

"ALTER TABLE student_info ADD the_score_for_%s_week,group INTEGER DEFAULT 0" % week
"UPDATE student_info SET the_score_for_%s_week,group=0" % week)
"UPDATE week SET week =%s" % week

当用户的鼠标点击学生姓名时,第二个网格将显示历史分数。

 "SELECT date,change FROM log WHERE the_score_for_%s_week=%s and student_name='%s'" % (week, student)

该图表将显示分数如何变化。与第二个网格不同,我们需要完整的分数,而不是 +1 或 -1 来绘制图表。

"SELECT score FROM log WHERE the_score_for_%s_week=%s and student_name='%s'" % (week, student))

如您所见,数据库设计很糟糕。 知道StackOverFlow不是代码审查网站。但我只想告诉你更多细节。我尝试改进数据库结构很多次,但我对此一无所知。

最后,感谢您阅读这个很长的问题。

4

2 回答 2

0

我建议将分数从学生信息表中取出,然后将它们放入单独的表中。这可能不需要 LOG 表,因为您可以即时检查这些详细信息。

Student_Info 将包含:

ID
Name
Group

新表 Result_Details 将包含:

ID
Date
Student_Info_ID
Score

当新的一周开始时,您可以在 Result_Details 中将详细信息作为新行输入,而不必每周向 Student_Info 添加新列。

然后要检索学生的分数列表,您可以使用以下内容:

select SI.Name, RD.Date, RD.Score 
from Student_Info as SI 
Join Result_Details RD on RD.Student_Info_ID = SI.ID
Where SI.Name = 'Tom'
于 2012-12-24T10:55:12.090 回答
0

好吧,我假设您的问题旨在提高您的知识,以了解编程的各个方面,而不是您试图获得捷径答案的一些学校作业项目。在我看来,以下链接相当清楚地了解 SQL 的含义。http://www3.ntu.edu.sg/home/ehchua/programming/sql/Relational_Database_Design.html唯一需要注意的是,这些天没有 SQL 和 SQL。NOSQL 数据库本质上是数据库,其中由 CODD 产生的行和列格式被丢弃,取而代之的是没有正式行结构的数据块。两者不应混淆。在适当的情况下,每个人都会超越另一个人。

如果上述文章没有,谷歌搜索“关系数据库设计教程”将有所帮助。简而言之:这个问题的第 1 步是了解 SQL 数据库是关于什么的。其他的都在后面......

希望这可以帮助

于 2012-12-24T14:01:10.170 回答