我正在为VLE开发一种奖励系统,该系统使用三种独立的技术-JavaScript用于大多数客户端/显示处理,PHP与数据库进行通信以及MySQL用于数据库本身。

我已经附上了“交易”表的三个屏幕截图。它的结构,一些示例记录以及其详细信息的概述。

前提是教职员工会奖励表现良好的学生,等等。这意味着30个学生的类(class)会同时获得一个分数。工作人员每周只能使用300点积分,目前大约有85位工作人员正在使用该系统(这可能会增加)。

目前,我的操作方式是,每个“交易”都有一个“Giver_ID”(授予工作人员积分的成员),一个“Recipient_ID”(获得积分的学生),一个类别和一个原因。这样,每当一名职员发布30分时,我就会在数据库中放入30行。

这似乎很早就起作用了,但是在三周之内,数据库中已经有超过12,000个事务。

在这一点上,它变得更加复杂。在“分配分数”页面上(另附有屏幕截图),当老师单击某个类(class)或搜索单个学生时,我希望显示学生的分数。我目前可以在系统上执行此操作的唯一方法是执行“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;
    }
}

所以,我的问题是,我实际上应该如何处理呢?全文索引;也许是一个学生表,其总积分值在每次输入交易时都会更新;批量交易(即,一个以上的学生在同一类别中获得相同的分数)被分组到一个数据库行中?这些都是我已经考虑过的事情,但是我会爱一个比我自己拥有更多数据库知识的人来提供启发。

示例记录

表结构

表概述

分配点界面

提前谢谢了。

最佳答案

您的问题是您的查询:

SELECT * FROM `transactions`

随着您的数据集变大,这将花费更长的时间加载并需要更多的内存来存储它。而是确定您具体需要哪些数据。如果是针对特定用户的:
SELECT SUM(points) FROM `transactions` WHERE Recipient_ID=[x]

或者,如果您想要所有学生的全部款项:
SELECT Recipient_ID, SUM(points) AS Total_Points FROM `transactions` GROUP BY Recipient_ID;

为了加快对特定字段的选择,您可以为该字段添加索引。这将加快选择速度,尤其是随着表格的增长。
ALTER TABLE `transactions` ADD INDEX Recipient_ID (Recipient_ID);

或者,如果您想显示transactions中所有条目的分页列表:
SELECT * FROM `transactions` LIMIT [page*num_records_per_page],[num_records_per_page];

e.g.: SELECT * FROM `transactions` LIMIT 0,25 ORDER BY Datetime; # First 25 records

关于php - 优化数据库结构,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7650332/

10-11 15:59
查看更多