Estoy desarrollando un sistema de recompensa para nuestro VLE que utiliza tres tecnologías separadas: JavaScript para la mayoría del procesamiento del cliente/pantalla, PHP para comunicarse con la base de datos y MySQL para la base de datos.Optimización de la estructura de la base de datos
He adjuntado tres capturas de pantalla de mi tabla de "transacciones". Su estructura, algunos registros de ejemplo y una visión general de sus detalles.
La premisa es que los miembros del personal otorgan puntos a los estudiantes por su buen comportamiento, etc. Esto puede significar que las clases de 30 estudiantes reciben puntos a la vez. El personal tiene un límite de 300 puntos por semana y hay alrededor de 85 empleados que actualmente acceden al sistema (esto puede aumentar).
La forma en que lo estoy haciendo en este momento, cada "transacción" tiene un "Giver_ID" (el miembro del personal que otorga puntos), un "Recipient_ID" (el estudiante que recibe los puntos), una categoría y un motivo . De esta forma, cada vez que un miembro del personal emite 30 puntos, estoy ingresando 30 filas en la base de datos.
Esto pareció funcionar desde el principio, pero en tres semanas ya tengo más de 12,000 transacciones en la base de datos.
En este punto se vuelve un poco más complicado. En la página Asignar puntos (otra captura de pantalla adjunta), cuando un profesor hace clic en una de sus clases o busca un alumno en particular, quiero que se muestren los puntos de los alumnos. La única forma en que actualmente puedo hacer esto en mi sistema es hacer un "SELECT * FROM 'transactions'
" y poner toda la información en una matriz utilizando la JS siguiente:
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;
}
}
}
Al registrarse en el sistema internamente, esto parece funcionar Suficientemente rapido. Sin embargo, cuando se inicia sesión externamente, este proceso toma alrededor de 20 segundos y, por lo tanto, no muestra los valores de puntos de los estudiantes hasta que haya hecho clic/buscado varias veces.
estoy usando el siguiente código en mi PHP para acceder a estas operaciones:
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;
}
}
lo tanto, mi pregunta es, ¿cómo debo en realidad estar acercándose a esto? Índices de texto completo; tal vez una tabla de estudiantes con sus valores totales de puntos que se actualiza cada vez que se ingresa una transacción; transacciones masivas (es decir, más de un estudiante recibiendo los mismos puntos para la misma categoría) agrupados en una única fila de base de datos? Estas son todas las cosas que he contemplado, pero me encantaría que alguien con más conocimientos de DB que yo para proporcionar la iluminación.
Ejemplo registra
estructura Tabla
Tabla de resumen
Puntos Asignar interfaz
Muchas gracias de antemano.
Bien pedido ... – slandau