我正在为我们的VLE开发一个奖励系统,该系统使用三种独立的技术 - 用于大多数客户端/显示处理的JavaScript,用于与数据库通信的PHP以及用于数据库本身的MySQL。优化数据库结构
我附上了我的“交易”表的三个屏幕截图。其结构,一些示例记录和其细节概述。
前提是员工成员奖励指向学生的良好行为等。这可能意味着30名学生的班级在同一时间给予积分。员工每周限制300点,目前有85名员工正在访问系统(这可能会增加)。
我现在的做法是,每个“交易”都有一个“Giver_ID”(员工奖励积分),一个“Recipient_ID”(接收积分的学生),一个类别和一个原因。这样,每当员工发出30分时,我就把30行放入数据库中。
这似乎在早期工作,但在三个星期内,我已经在数据库中有超过12,000个事务。
在这一点上它变得更复杂一点。在Assign Points页面(附带的另一个屏幕截图)上,当老师点击其中一个班级或搜索某个学生时,我希望显示学生的分数。我目前能做到这一点我的系统上的唯一方法是做一个“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;
}
}
所以,我的问题是,我应该怎么实际地接近这一点?全文索引;可能是一张学生表,其总积分值每次进入交易时都会更新;大量交易(即多于一名学生接受同一类别的相同分数)被分组到单个数据库行中?这些都是我所想到的,但我会喜欢有比我更多的数据库知识的人来提供启发。
实施例记录
表结构
表概述
分配点数接口
非常感谢提前。
很好问... – slandau