Tôi đang phát triển hệ thống phần thưởng cho VLE sử dụng ba công nghệ riêng biệt - JavaScript cho hầu hết các xử lý phía máy khách/hiển thị, PHP để giao tiếp với cơ sở dữ liệu và MySQL cho cơ sở dữ liệu.Tối ưu hóa cấu trúc cơ sở dữ liệu
Tôi đã đính kèm ba ảnh chụp màn hình của bảng "giao dịch" của tôi. Cấu trúc của nó, một vài bản ghi ví dụ và tổng quan về các chi tiết của nó.
Tiền đề là các thành viên của điểm thưởng nhân viên cho sinh viên có hành vi tốt vv Điều này có nghĩa là các lớp học của 30 sinh viên được cho điểm tại một thời điểm. Nhân viên có giới hạn 300 điểm/tuần và có khoảng 85 nhân viên hiện đang truy cập vào hệ thống (điều này có thể tăng).
Cách tôi đang thực hiện tại thời điểm này, mọi "giao dịch" đều có "Giver_ID" (thành viên của nhân viên trao điểm), "Recipient_ID" (sinh viên nhận điểm), danh mục và lý do . Bằng cách này, mỗi khi một thành viên của nhân viên phát hành 30 điểm, tôi sẽ đặt 30 hàng vào cơ sở dữ liệu.
Điều này dường như hoạt động sớm, nhưng trong vòng ba tuần, tôi đã có hơn 12.000 giao dịch trong cơ sở dữ liệu.
Tại thời điểm này nó trở nên phức tạp hơn một chút. Trên trang Gán điểm (một ảnh chụp màn hình khác được đính kèm), khi giáo viên nhấp vào một trong các lớp học của họ hoặc tìm kiếm một cá nhân học sinh, tôi muốn các điểm của sinh viên được hiển thị. Cách duy nhất mà tôi hiện có thể làm điều này trên hệ thống của tôi là để làm một "SELECT * FROM 'transactions'
" và đặt tất cả các thông tin vào một mảng bằng cách sử dụng JS sau:
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;
}
}
}
Khi đăng nhập vào hệ thống nội bộ, điều này dường như làm việc đủ nhanh. Tuy nhiên, khi đăng nhập bên ngoài, quá trình này mất khoảng 20 giây và do đó không hiển thị giá trị điểm của sinh viên cho đến khi bạn nhấp/tìm kiếm một vài lần.
Tôi đang sử dụng đoạn mã sau trong PHP của tôi để truy cập vào các giao dịch:
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;
}
}
Vì vậy, câu hỏi của tôi là, làm thế nào nên tôi thực sự được tiếp cận này? Chỉ mục toàn văn; có thể là một bảng học sinh với tổng giá trị điểm được cập nhật mỗi khi một giao dịch được nhập vào; giao dịch đại chúng (nghĩa là nhiều hơn một sinh viên nhận cùng một điểm cho cùng một danh mục) được nhóm thành một hàng cơ sở dữ liệu duy nhất? Đây là tất cả những điều tôi đã dự tính nhưng tôi yêu một người có nhiều kiến thức về DB hơn bản thân mình để cung cấp sự giác ngộ.
Ví dụ ghi
cấu trúc Bảng
tổng quan Bảng
Điểm Gán giao diện
Rất cám ơn trước.
Được yêu thích ... – slandau