我只对数据库设计和 SQL 有一点了解。我为学习编程和数据库编写了一个简单的学生分数管理器,但我的设计很糟糕。
数据库结构
我的数据库有三个表:
- 学生信息
- 日志
- 星期
先来说说吧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不是代码审查网站。但我只想告诉你更多细节。我尝试改进数据库结构很多次,但我对此一无所知。
最后,感谢您阅读这个很长的问题。