Оптимизация структуры базы данных

Я разрабатываю систему вознаграждения для нашей VLE, ​​в которой используются три отдельные технологии - JavaScript для большей части клиентской / отображаемой обработки, PHP для связи с базой данных и MySQL для сама база данных.

Я приложил три скриншота моей таблицы «транзакций». Его структура, несколько примеров записей и обзор его деталей.

Предполагается, что сотрудники начисляют баллы студентам за хорошее поведение и т. Д. Это может означать, что классы из 30 студентов получают баллы одновременно. Персонал имеет ограничение в 300 баллов в неделю, и в настоящее время к системе имеют доступ около 85 сотрудников (эта цифра может возрасти).

Как я это делаю сейчас, каждая «транзакция» имеет «Giver_ID» (член персонала, начисляющий баллы), «Recipient_ID» (студент, получающий баллы), категорию и причину. Таким образом, каждый раз, когда сотрудник выставляет 30 баллов, я помещаю 30 строк в базу данных.

Поначалу казалось, что это сработало, но в течение трех недель у меня уже было более 12 000 транзакций в базе данных.

На этом этапе все становится немного сложнее. На странице «Назначение баллов» (еще один снимок экрана прилагается), когда учитель нажимает на один из своих классов или ищет отдельного учащегося, я хочу, чтобы отображались баллы учащихся.Единственный способ, которым я сейчас могу это сделать в своей системе, - это выполнить « SELECT * FROM 'transaction' » и поместить всю информацию в массив, используя следующий 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;
    }
}

Итак, мой вопрос: как мне на самом деле подойти к этому? Полнотекстовые индексы; может быть, таблица студентов с их общими баллами, которая обновляется каждый раз при вводе транзакции; массовые транзакции (то есть более одного студента, получающего одинаковые баллы в одной и той же категории) сгруппированы в одну строку базы данных? Это все, о чем я думал, но мне бы хотелось, чтобы кто-нибудь с большим знанием БД, чем я, обеспечил просветление.

Примеры записей Example records

Структура таблицы Table structure

Обзор таблицы Table overview

Интерфейс назначения точек Assign Points interface

Заранее большое спасибо.

8
задан dunc 4 October 2011 в 15:29
поделиться