Ver Mensaje Individual
  #4 (permalink)  
Antiguo 11/10/2009, 08:45
Avatar de gnzsoloyo
gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: como establecer parametros de consulta variables

Cita:
veamos, fundamentalmente tengo dos tablas: actividades y usuarios. actividades tiene campos como categoria de la actividad, precio, dias de la semana que se realiza, horario, etc. la tabla usuarios tiene los campos usuario, precio maximo a pagar, categorias en las que esta interesado, y los siete que cite antes con los dias de la semana. esos siete campos son varchar y almacenan las horas que el usuario esta disponible (ej: 14,15,16,20,21,22).
Bien, por lo que dices, está faltando un poco de análisis sobre la base del modelo Entidad-Relación (aquí tienes un PDF bastante didáctico que encontré en la web, si no has visto el tema), ya que cuando se aplica el modelo a tu caso, surgirán las siguientes restricciones (estoy poniendo algunas cosas que están implícitas por sistema, más allá de que no las mencionas):

1) Un usuario puede realizar una o más actividades.
2) Cada actividad con horario se desarrolla en una comisión.
3) Cada comisión tiene un único horario y día.
4) Una misma actividad puede desarrollarse en varios horarios diferentes en diferentes días.
5) Una misma actividad en un mismo horario deberá ser coordinada por una sola persona.
6) Una misma actividad en un mismo horario puede contar con asistentes de coordinación.
7) Un mismo miembro del staff puede ser titular de una o más actividades y asistente de otras, siempre que no se superpongan horarios.

Ese sería un esquema básico de restricciones, que se debe definir antes de ponerse a identificar las entidades, las cuales se deben determinar antes de pensar en decir cuáles tablas se usarán.
¿Por qué antes?
Porque de establecer la relación de cardinalidades entre los diferentes elementos que relacionan los objetos, surge cuál es la relación de tablas a crear.

En este esquema mínimo encontramos:
- Usuarios.
- Actividad.
- Comision.
- Horario.
- Coordinador.
- Asistentes.

(Si esto parece exagerado en cantidad de tablas, te cuento que ese ejemplo se usa en las clases de las universidades en las asignaturas de Bases de Datos, y en realidad la solución implica un mínimo de 12 tablas y hasta 17, según los parámetros que se den)

La idea de esta "atomización" de las relaciones es:
- Proteger la integridad de datos.
- Mantener la consistencia de datos.
- Evitar la redundancia innecesaria.
- Reducir los requerimientos de almacenamiento.

En este conjunto, las relaciones que se consultan serán, por ejemplo Usuarios, Actividades, Comisiones y Horarios, para saber qué horarios y cuántos tiene cada usuario, por ejemplo.
Tales consultas son menos complejas de lo que parecen, precisamente porque esta "atomización", luego de aplicar la normalización, permite crear sentencias de gran simplicidad que devuelven una cantidad eficiente de registros.

En tu caso, y según el ejemplo que planteo, las tablas podrían ser:
USUARIO(username, nombre, apellido, ...)
ACTIVIDAD(actividad_id, denominacion, otros...)
USUARIO_ACTIVIDAD(username, comision_id, fechaInscrip)
COMISION(comision_id, horario_id, Actividad_id, otros...)
HORARIO(horario_id, inicio, fin, fecha, comision_id, otros...)
COORDINADOR(staff_id, comision_id, otros...)
ASISTENTE(staff_id, comision_id, otros...)
STAFF(staff_id, Nombre, apellido, otros...)

Detalles:
- La aparición de una tabla adicional como es usuario_actividad, se debe a que toda relación N:N entre dos entidades crea una tabla.
- No hay relación directa entre un usuario y una actividad, porque un usuario se inscribe en la comisión, no en la actividad, ya que es la comisión la que debe ser de una actividad (cuestiones conceptuales).
- Hay dos tablas con el mismo contenido porque son entidades diferentes: Coordinador y Asistente. Coordinador es mandatoria (debe haber uno),mientras la relación con la otra en opcional (puede haber uno); si unificas ambos en la misma tabla tendrás el problema que te hará aparecer otra (una de categorías con la Comision) y agregará campos en la de comisión para vincularla.

Dejo aquí para que me digas si la cosa se va entendiendo.
Cualquier duda te sugiero que le des una mirada (si nunca viste el tema) al PDF cuyo link te puse.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Última edición por gnzsoloyo; 11/10/2009 a las 08:52