2011-10-17 8 views
6

Estamos construyendo una herramienta eLearning MultipleChoice donde miles de usuarios completarán nuestras pruebas. Ya tenemos miles de suscriptores en nuestros otros seminarios, etc., por lo que es muy probable que miles completen también las pruebas MC. Ahora, necesitamos hacer un seguimiento de cada pregunta que cada usuario ha respondido, cuánto tiempo le tomó, si fue correcta (después de cuántos intentos) y si no, qué respuesta incorrecta dio, etc. Realmente hay muchos datos.Hacer una tabla SQL para cada usuario del sitio web (miles) con miles de filas?

Ahora, vamos a tener miles de preguntas y miles de usuarios. Dado que cada pregunta tendrá al menos 4 respuestas y también queremos hacer un seguimiento de las respuestas incorrectas, mi pregunta es: en este caso particular, ¿tendría sentido tener una tabla por usuario?

Sé que la pregunta de tabla por usuario ya se ha preguntado aquí (here, por ejemplo), pero siento que este es realmente un caso diferente.

Entonces: ¿Una tabla con millones de filas o miles de tablas con miles de filas?

+3

¿Quién marcó esto? El OP pregunta sobre las opciones. Si marca una pregunta porque el OP no era correcto desde el principio, sería un Wiki y no un foro de preguntas y respuestas. Sheesh. – MatBailie

Respuesta

7

Nunca tiene sentido tener un objeto de base de datos por usuario. Si diseña su tabla y estructura de base de datos de forma adecuada, una tabla con un millón de filas es fácilmente manejable.

Una tabla por usuario será muy inmanejable, y no es así como se diseñan las bases de datos relacionales.

Cree una tabla para los usuarios y cumpla con las mejores prácticas de RDBMS. Implemente el ajuste de consultas y asegúrese de que haya índices apropiados en la tabla, así como estadísticas actualizadas.

+3

+1: con el uso correcto de la normalización, claves, índices, etc. primarios y foráneos, nunca necesitará una tabla por usuario. Aquí está el corolario; ¿alguna vez necesitarías una nueva clase por usuario en un idioma OO? – MatBailie

1

Muchos RDMS le permiten crear tablas particionadas; Creo que esa sería la mejor opción en su caso (una tabla dividida para todos los usuarios, depende de RDMS que esté utilizando, tendrá diferentes opciones para especificar la clave de la partición)

+0

Estamos planeando usar MySql, por lo que debería ser posible en nuestro servidor. Veré esa opción. Es bueno escuchar comentarios tan definitivos de todos. Supongo que será mejor que vaya con la solución de una sola mesa, entonces. ¡Gracias! – Jonas

4

La respuesta habitual es esa "tabla por usuario" es un diseño horrible, y la solución simple es una sola tabla con campos adicionales para identificar la propiedad.

p. Ej. teniendo

table_1 table_2 table_3 ...... table_999999999 
id  id   id    id 
...  ...  ...   ... 

es un enorme desperdicio de recursos, mientras que tener

table 
id 
user 
... 

es mucho más fácil de representar.

+0

Gracias, Marc. ¿Así que simplemente agregaría una columna llamada "usuario" en la "una tabla principal", pondría la ID de usuario allí y luego mostraría todos los millones de preguntas correcta e incorrectamente respondidas en una sola tabla? Todavía estoy en las primeras etapas de planificación (comencé la semana pasada con Latex-Converters), ¡así que todavía soy muy flexible !;) ¡Gracias! – Jonas

+0

Podría tener una tabla con campos como este ... 'UserID, TestID, QuestionID, SubmittedAnswerID, TimeSubmitted, ThinkingTime'. Luego, toda su información de usuario se incluye en una tabla, su información de prueba en otra tabla, la lista de preguntas en otra tabla, la lista de posibles respuestas en otra tabla, etc., etc. Si separa todo el tipo de datos, usted se dirige en la dirección correcta. – MatBailie

+0

¡Hola, demócratas! ¡Gracias! Tengo las tablas de preguntas/respuestas configuradas de esta manera: una tabla para preguntas, una tabla para respuestas (múltiples por ID de pregunta) y una para explicaciones sobre por qué las respuestas incorrectas son incorrectas (conectadas por "answerid"). así que ahora todo lo que necesito es esa "tabla de usuario" y estoy bien, ¿en tu opinión? también, ¿pondría todas las preguntas en una tabla o tendría una tabla para cada tema (que tiene aproximadamente 30 pruebas cada una (y 30 preguntas cada una) y alrededor de 20 temas en total)? ¡gracias! – Jonas

0

Definitivamente no usaría una tabla por usuario, eso sería una pesadilla para mantener.

Si yo fuera a tratar de diseño de la base de datos que probablemente intentará romper los datos tanto como sea posible, por lo que por ejemplo tiene:

tabla Usuarios: Contiene todos los usuarios Preguntas: contiene todas las preguntas

resultados: Contiene todos los resultados ID de usuario, test_id, el tiempo

prueba testid, IdPregunta, respuestas, time_to_complete

Respuestas answer_id, responder

Así que en este escenario su tabla de resultados es una visión general, tiene la UserSID, la prueba tomaron y el tiempo para completarlo, esto es una visión general de todo el asunto. A continuación tiene la tabla de prueba, esta es la prueba completa que el usuario tomó pregunta por pregunta, por lo que tiene id de la pregunta, un enlace a una tabla con cada respuesta que el usuario envió, y luego tiempo para completarlo. tabla de respuestas tiene cada respuesta del usuario presentado

Así los datos se vería así:

Results 
UserID, TestID, Time 
1   1  00:11 

Test 
TestID QuestionID, answers, time_to_complete 
1  1    1   00:10:00 
1  2    2   00:01:00 

Answers 
answer_id, Answers 
    1   A 
    1   B 
    2   A 
    3   A 
    3   B 
    3   C 

Este enfoque permitirá seleccionar los datos específicos para cada usuario, ver la cantidad de veces que se han tomado un etc prueba y sería mucho más fácil de administrar que miles de tablas.

+0

hey purplegoldfish! gracias por esta respuesta detallada. Esto suena como una buena manera de ir también. Solo una pregunta: en la tabla "prueba", también agregaría el ID de usuario, ¿verdad? Aquí no estoy muy metido de puntillas, pero no entendía muy bien si crearías una nueva tabla de pruebas para cada prueba que tomara cada usuario (así que si tomo la prueba 1, se crearía una tabla y si la volví a tomar una nueva tabla se crearía, etc.) o si agregaría todos los resultados de todos los usuarios de todas las pruebas en esa tabla. ¿Podrías aclarar? ¡Gracias! – Jonas

+0

Probablemente la tabla de prueba no se identifique de la mejor manera, pero la idea es que tenga su ID de usuario en la tabla de resultados, luego la tabla de prueba se vincula a la tabla de resultados en TestID para que no necesite un ID de usuario. Probablemente pueda encontrar algunos nombres más apropiados para las tablas, pero la idea es enlaces de Resultados a prueba, enlaces de prueba a respuestas. No estoy seguro si tiene pruebas predefinidas o solo preguntas al azar, pero pensé que lo llamaría Prueba solo para mostrar todas las preguntas que un usuario tomó en una sesión. – Purplegoldfish

Cuestiones relacionadas