【发布时间】:2011-11-30 19:25:01
【问题描述】:
我正在为我们的 VLE 开发一个奖励系统,它使用三种独立的技术 - JavaScript 用于大多数客户端/显示处理,PHP 用于与数据库通信,MySQL 用于数据库本身。
我附上了我的“交易”表的三个屏幕截图。它的结构、一些示例记录及其详细信息的概述。
前提是工作人员会为表现良好的学生奖励积分。这可能意味着 30 名学生的班级一次获得积分。员工的积分上限为每周 300 点,目前约有 85 名员工正在访问该系统(这可能会增加)。
我现在的做法是,每笔“交易”都有一个“Giver_ID”(授予积分的员工)、一个“Recipient_ID”(获得积分的学生)、一个类别和一个原因。这样一来,每次有员工发出 30 分,我就将 30 行放入数据库中。
这在早期似乎可行,但在三周内我的数据库中已经有超过 12,000 笔交易。
此时它变得有点复杂。在“分配分数”页面(附上另一个屏幕截图)上,当老师点击他们的一个班级或搜索单个学生时,我希望显示学生的分数。我目前可以在我的系统上执行此操作的唯一方法是执行“SELECT * FROM 'transactions'”并使用以下 JS 将所有信息放入一个数组中:
var Points = { "Recipient_ID" : "0", "Points" : "0" };
function getPoints (data) {
for (var i = 0; i < data.length; i++) {
if (Points[data[i].Recipient_ID]) {
Points[data[i].Recipient_ID] = parseInt(Points[data[i].Recipient_ID]) + parseInt(data[i].Points);
} else {
Points[data[i].Recipient_ID] = data[i].Points;
}
}
}
在内部登录系统时,这似乎运行得足够快。但是,在外部登录时,此过程大约需要 20 秒,因此在您单击/搜索几次之前不会显示学生的积分值。
我在我的 PHP 中使用以下代码来访问这些事务:
function getTotalPoints() {
$sql = "SELECT *
FROM `transactions`";
$res = mysql_query($sql);
$rows = array();
while($r = mysql_fetch_assoc($res)) {
$rows[] = $r;
}
if ($rows) {
return $rows;
} else {
$err = Array("err_id" => 1);
return $err;
}
}
所以,我的问题是,我实际上应该如何处理这个问题?全文索引;可能是一个学生表,其总分值在每次输入交易时都会更新;大量交易(即多个学生在同一类别中获得相同分数)分组到单个数据库行中?这些都是我考虑过的事情,但我希望有人比我拥有更多的 DB 知识来提供启发。
示例记录
表结构
表格概览
分配积分界面
非常感谢。
【问题讨论】:
标签: php javascript mysql