我正在爲我們的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