Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

¿Uso una tabla o dos?

Estas en el tema de ¿Uso una tabla o dos? en el foro de Mysql en Foros del Web. Hola buenas, Estoy haciendo un sistema para entrega online de prácticas de laboratorio. Tengo una tabla donde se insertan las prácticas entregadas con los siguientes ...
  #1 (permalink)  
Antiguo 30/05/2008, 00:58
 
Fecha de Ingreso: diciembre-2007
Mensajes: 50
Antigüedad: 16 años, 4 meses
Puntos: 0
¿Uso una tabla o dos?

Hola buenas,

Estoy haciendo un sistema para entrega online de prácticas de laboratorio. Tengo una tabla donde se insertan las prácticas entregadas con los siguientes campos:

Código:
CREATE TABLE `practicas` (
  `idEnunciado` int(10) unsigned NOT NULL,
  `idUsuario` int(10) unsigned NOT NULL,
  `fechaEntrega` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
  `fichero` varchar(45) NOT NULL,
  `copiada` varchar(25) default NULL,
  `calificacion` varchar(5) default NULL,
  `anotacion` varchar(45) default NULL,
  PRIMARY KEY  (`idEnunciado`,`idUsuario`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
Cuando un usuario entrega la práctica se registra el enunciado, el usuario, la fecha de entrega y el nombre del fichero. Más tarde tengo un proceso que actualiza los campos copiada, calificación y anotación. El problema es el siguiente, si un alumno entrega una práctica pero forma parte de un grupo de alumnos, tendría que crear un registro en esta tabla por cada alumno que pertenezca a su grupo, todo esto porque cada alumno puede tener una calificación diferente aunque entreguen la práctica en como un grupo. Mi planteamiento es si es correcto crear un registro por cada usuario cuando uno entregue una práctica, o si es mejor meter las calificaciones en otra tabla y dejarme de líos... Espero haber sido claro

Un saludo,
  #2 (permalink)  
Antiguo 30/05/2008, 01:57
Avatar de PosProdukcion  
Fecha de Ingreso: noviembre-2004
Ubicación: Manzanares el Real (Madrid)
Mensajes: 726
Antigüedad: 19 años, 4 meses
Puntos: 9
Respuesta: ¿Uso una tabla o dos?

Pues al final cada uno tendrá su propio criterio, pero yo creo que tu plantemiento es correcto, suponiendo que los enunciados están en una tabla aparte, ya que parece ser que cada alumno podría tener varias prácticas y a su vez, cada práctica puede pertenecer a varios alumnos, ¿no es así?, entonces lo correcto sería hacer una tabla intermedia de relación, algo así....

Código:
  +------------+           +------------------+          +----------+
  | ENUNCIADOS | ------- < | PRACTICAS-ALUMNO | >------  |  ALUMNOS |
  +------------+           +------------------+          +----------+

  (esto A ------< B es un Foerign Key desde B hasta A)
La tabla PRACTICAS-ALUMNO es la que tu llamas PRACTICAS, con la misma estructura. Si además quisieras mantener los grupos de alumnos podrías meter una tabla GRUPOS para que el proceso de insertar prácticas entregadas recorra los alumnos de cada grupo y cree los registros de forma automática...

Pero será bueno que opinen otros...
  #3 (permalink)  
Antiguo 30/05/2008, 02:23
 
Fecha de Ingreso: diciembre-2007
Mensajes: 50
Antigüedad: 16 años, 4 meses
Puntos: 0
Respuesta: ¿Uso una tabla o dos?

Cita:
Iniciado por PosProdukcion Ver Mensaje
Pues al final cada uno tendrá su propio criterio, pero yo creo que tu plantemiento es correcto, suponiendo que los enunciados están en una tabla aparte, ya que parece ser que cada alumno podría tener varias prácticas y a su vez, cada práctica puede pertenecer a varios alumnos, ¿no es así?, entonces lo correcto sería hacer una tabla intermedia de relación, algo así....

Código:
  +------------+           +------------------+          +----------+
  | ENUNCIADOS | ------- < | PRACTICAS-ALUMNO | >------  |  ALUMNOS |
  +------------+           +------------------+          +----------+

  (esto A ------< B es un Foerign Key desde B hasta A)
La tabla PRACTICAS-ALUMNO es la que tu llamas PRACTICAS, con la misma estructura. Si además quisieras mantener los grupos de alumnos podrías meter una tabla GRUPOS para que el proceso de insertar prácticas entregadas recorra los alumnos de cada grupo y cree los registros de forma automática...

Pero será bueno que opinen otros...
Hola PosProdukcion, gracias por contestar, lo que tengo montado es como tu indicas, estás en lo correcto, el problema es si uso la tabla PRACTICAS-ALUMNO para almacenar la calificación de la práctica entregada, o esta información la meto en otra tabla. Esto lo planteo por lo siguiente:

- Si lo dejo en la tabla "Practicas Alumno", cuando un alumno perteneciente a un grupo entregue la práctica, tendría que crear un registro en la tabla por cada alumno, repitiendo información, "fecha entrega", "fichero"... ¿No sería más conveniente tener otra tabla a parte para que se califiquen todas las prácticas, incluido los alumnos que no la presenten?

- Lo que planteo sería algo así:

Código:
  +------------+           +------------------+          +----------+
  | ENUNCIADOS | ------- < | PRACTICAS-ALUMNO | >------  |  ALUMNOS |
  +------------+           +------------------+          +----------+
       __
        |
        |
        |
       /\
+-----------------+
| Calificaciones |
+-----------------+

  Las FK igual que en prácticas-alumnos, o me creo mejor un id en practicas alumno y hago la fk con esa id?
  #4 (permalink)  
Antiguo 30/05/2008, 03:28
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: ¿Uso una tabla o dos?

Yo creo que las calificaciones deben ir en la tabla practicasalumno, pues lo que se califica es la práctica y no el enunciado, pues la práctica, su calificación, pertenece al alumno, mientras que el enunciado puede pertenecer a más de un alumno. Puesto que el enunciado puede ser el mismo para las prácticas de todos los alumnos del grupo, sepáralo junto con todos sus atributos. En la tabla practicasalumno estaría el id_practicaalumno (PK), id_alumno (FK), id_enunciado(FK), calificacion, etc.
Luego la tabla alumnos con los datos concretos del alumno y su id_alumno (PK), y un id_grupoalumno(FK), y luego una tabla grupoalumnos con su id_grupoalumno(PK). Entiendo un alumno sólo puede pertenecer a un grupo y que no hay calificación de grupo, pero si la hubiera y necesitaras calificar en varias ocasiones ese grupo, tendrías que hacer una tabla calificaciongrupo relacionada. Si sólo vas a calificar al grupo una vez, te bastaría con un campo calificación en la tabla grupo.
  #5 (permalink)  
Antiguo 30/05/2008, 03:47
 
Fecha de Ingreso: diciembre-2007
Mensajes: 50
Antigüedad: 16 años, 4 meses
Puntos: 0
Respuesta: ¿Uso una tabla o dos?

Hola Jurena, muchas gracias por tu respuesta, creo que no has entendido bien lo que planteo, pero es dificil de explicar o de mostraros el esquema que tengo montado. Voy a intentar explicar lo que tengo montado, aunque es un poco complicado.

Tengo por un lado una tabla grupo_alumnos con tres campos, idGrupoLaboratorio, idUsuario e idGrupoAlumno. Si los alumnos no están agrupados, idGrupoAlumno es NULL, si están agrupados tienen el mismo código.

Código:
CREATE TABLE `grupo_alumnos` (
  `idUsuario` int(10) unsigned NOT NULL,
  `idGrupoLaboratorio` int(10) unsigned NOT NULL,
  `idGrupoAlumnos` int(10) unsigned default NULL,
  PRIMARY KEY  (`idUsuario`,`idGrupoLaboratorio`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
Por otro lado tengo la tabla enunciados, contiene todos los campos necesarios de info general de la práctica:
Código:
 CREATE TABLE `enunciados` (
  `idEnunciado` int(10) unsigned NOT NULL auto_increment,
  `idGrupoLaboratorio` int(10) unsigned NOT NULL,
  `titulo` varchar(45) NOT NULL,
  `fechaTope` date NOT NULL,
  `directorio` varchar(150) NOT NULL,
  `validar` char(1) character set latin1 NOT NULL,
  `url` varchar(200) default NULL,
  PRIMARY KEY  (`idEnunciado`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Luego tengo la tabla prácticas:

Código:
CREATE TABLE `practicas` (
  `idEnunciado` int(10) unsigned NOT NULL,
  `idUsuario` int(10) unsigned NOT NULL,
  `fechaEntrega` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
  `fichero` varchar(45) NOT NULL,
  `copiada` varchar(25) default NULL,
  `calificacion` varchar(5) default NULL,
  `anotacion` varchar(45) default NULL,
  PRIMARY KEY  (`idEnunciado`,`idUsuario`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Esta tabla almacena la información de las prácticas entregadas. Lo que no se que es más correcto hacer es:

- Las prácticas se entregan Online, por lo que con que la entregue un usuario vale, si meto el campo calificación en esta tabla,tendría que crear registros repetidos para usuarios del mismo grupo, repetidos en cuanto a nombre de fichero, fecha de entrega etc... Y lo que planteaba es guardar en esta tabla las prácticas entregadas con la información de usuario que entrega, y en otra tabla guardar solo las calificaciones:

Código:
CREATE TABLE `calificaciones` (
  `idEnunciado` int(10) unsigned NOT NULL,
  `idUsuario` int(10) unsigned NOT NULL,
  `calificacion` varchar(5) default NULL,
  PRIMARY KEY  (`idEnunciado`,`idUsuario`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Espero haberme explicado mejor ahora,

muchas gracias
  #6 (permalink)  
Antiguo 30/05/2008, 04:31
Avatar de PosProdukcion  
Fecha de Ingreso: noviembre-2004
Ubicación: Manzanares el Real (Madrid)
Mensajes: 726
Antigüedad: 19 años, 4 meses
Puntos: 9
Respuesta: ¿Uso una tabla o dos?

Pues yo optaría por no separar las calificaciones en otra tabla, no creo que sea tan grave repetir datos como fecha de entrega, fichero, etc. y separarlos supone mayor complicación en la programación y el mantenimiento de las tablas.

Al final, tirando por lo práctico, mi opción sería dejar las calificaciones en la tabla PRACTICAS, es solo una opinión.
  #7 (permalink)  
Antiguo 30/05/2008, 05:04
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: ¿Uso una tabla o dos?

Cita:
- Las prácticas se entregan Online, por lo que con que la entregue un usuario vale, si meto el campo calificación en esta tabla,tendría que crear registros repetidos para usuarios del mismo grupo, repetidos en cuanto a nombre de fichero, fecha de entrega etc... Y lo que planteaba es guardar en esta tabla las prácticas entregadas con la información de usuario que entrega, y en otra tabla guardar solo las calificaciones:
Tal y como lo cuentas, tú sólo guardas el codigo de usuario en la tabla practicas para saber quién te la entregó y a través de él ponerlo en relación con el alumno o con los alumnos del grupo cuando el mismo pertenece a algún grupo. Si ese código usuario es el mismo que el código alumno por lo que se refiere al número , creo que ahí sólo deberías guardar ese código usuario o código_alumno y ninguna calificación, pues ese formulario sería algo así como un formulario de entrega. Las calificaciones yo sólo las incluiría en la tabla calificaciones. Puedes saber los grupos que han entregado con la relación entre las tablas grupo y practicas establecida por los campos codigo_usuario o codigo_alumno, que según creo es el mismo que el código alumno (espero que así sea; de hecho no sé por qué tienes código_usuario y código_alumno). El trabajo no tiene calificación propia y sí los alumnos: por tanto, yo quitaría ese campo de esa tabla. Así lo veo. Tu verdadero problema por lo que se refiere a los grupos, entiendo yo, es que no puedes guardar junto al nombre del alumno que entrega el código del grupo (que sería lo ideal), porque cuando el alumno no pertenece a ningún grupo has dejado NULL en el campo de la tabla alumnos referido a grupos y eso te impide una relación PK, FK. Pero por el código alumno llegarás a todo.
Espero haberlo entendido...
  #8 (permalink)  
Antiguo 30/05/2008, 05:22
 
Fecha de Ingreso: diciembre-2007
Mensajes: 50
Antigüedad: 16 años, 4 meses
Puntos: 0
Respuesta: ¿Uso una tabla o dos?

Hola PosProdukcion, gracias por tu aporte, pero por la parte de validación que tengo que hacer, creo que me va a convenir más dejar las calificaciones en otra tabla.

Hola Jurena,

Tienes razón en todo lo que plantes, excepto en lo de código usuario, código alumno, no uso ningún código alumno, tengo un idGrupoAlumnos, que realmente debería llamarse número de grupo, que identifica únicamente que los alumnos con mismo idGrupoLaboratorio y con mismo idGrupoAlumnos pertenecen al mismo grupo. El problema que tengo es ese que indicas, que sea NULL este campo para los alumnos no agrupados, pero no se me ha ocurrido por ahora ninguna solución a este problema. Le daré unas vueltas más...


Muchas gracias de nuevo a los dos
  #9 (permalink)  
Antiguo 30/05/2008, 05:45
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: ¿Uso una tabla o dos?

Te diré lo que yo hacía y sigo haciendo en alguno de esos casos. Creo un grupo llamado no_grupo con su número de grupo, y los alumnos que no tienen grupo les asigno el número de grupo asignado a ese no grupo. Ventajas: evitas el nulo y tus relaciones no sufren. Luego a la hora de hacer las consultas distingues en la búsqueda los alumnos cuyo numero de grupo es el de no_grupo de los demás. Incoveniente: al agrupar para sacar medias, máximos por grupo, agruparía a todos los alumnos como pertenecientes a un grupo llamado no_grupo; pero tú puedes decirle en esas consultas que agrupe todos los grupos menos ese.
Otra opción sería poner grupos de un alumno y asignar los alumnos que no tienen grupo a esos grupos. Distinguirías los que grupos reales de los otros por el número de alumnos mayor que uno. Eso no sería un obstáculo para las agrupaciones y demás, pero sería un desperdicio de recursos y algo confuso.
Yo prefiero la primera, pero seguro que hay soluciones más profesionales, y, según lo que quieras hacer, tal vez nunca necesites una chapuza como estas, y te bastará el buen uso de un LEFT JOIN para mostrar los alumnos, tanto los que tienen grupo (con su grupo) como los que no...

Última edición por jurena; 30/05/2008 a las 06:12
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 04:56.