Duda con modelamiento

Rodrigo Fuentealba darkprox en gmail.com
Mar Ene 10 01:26:44 CLST 2006


Luis Vega wrote:
> Hola amigos.
> 
> Esoty desarrollando un pequeño sistema y me han surgido unas duda en los 
> que se refiere al modelo de datos.
> trabajo con php y mysql en un Debian sarge.
> 
> Tengo 3 tablas:
> alumno (id, nombre, rut, email)
> curso (id, nombre, descripcion)
> profesor (id, nombre, titulo)
> 

Con lo de alumno y curso, yo lo habria hecho asi (los tipos de datos 
siempre varian de acuerdo al gusto de uno... p.ej. yo prefiero guardar 
el RUT sin DV porque con una tarea que me enviaron quede traumado de 
tantos RUT...)

CREATE TABLE alumno (
	rut integer not null primary key,
	id integer not null auto_increment,
	nombre varchar(200) not null,
	email varchar(200) not null
);

CREATE TABLE curso (
	id integer not null primary key auto_increment,
	nombre varchar(200) not null,
	descripcion varchar(200) not null
);
> los alumnos pueden tener mas de un curso, eso es claro, pero la duda es 
> si es necesario crear una cuarta tabla en donde relacionar a los alumnos 
> con cada curso que ellos tengan y como validad en una pagina php que 
> alumno tiene tal cursos y quien no.

Las formas normales dicen que en una relacion muchos a muchos (un curso 
puede tener muchos alumnos y un alumno tiene muchos cursos), debe haber 
una tabla que las relacione, la cual llevará las claves primarias de 
ambas tablas que la generan. Por tanto, tenemos:

CREATE TABLE alumnocurso
(
	rut integer not null,
	id_curso integer not null,
	primary key (rut, id_curso),
	foreign key (rut) references alumno,
	foreign key (id_curso) references curso
);

Si cada curso tiene un profesor, entonces la clave principal (que sería 
más correcto que usaras el RUT del profesor que también es único, pero 
hay cada gusto idiota) de la tabla profesor debería ir como foránea en 
la tabla curso.

Listar los cursos en este caso sería algo como

$sql = "select a.nombre from curso a, alumnocurso b, alumno c where 
c.rut = b.rut and b.id_curso = c.id and a.rut = ".$rut;

eso lo metes a mysql_query y todo eso que ya debes saber... y ahí te 
saldrían en el resultset todos los cursos que tiene una persona de rut = 
$rut.

> cuando el alumno inicie sesion, debiera aparecer todos los cursos a los 
> que pertence y asi poder entrar a los respectivos contenidos, pero no 
> entrar a los demas contenidos aunque sepa la url de ellos. Aqui, quizas 
> una validacion en cada pagina se podria usar.

se me ocurre (veámoslo de manera fácil) que, si el alumno entra con su 
rut, podrías ponerle a la página un identificador de curso y preguntar 
en la tabla alumnocurso si es que hay un registro que tenga el rut del 
alumno y el curso. Si lo hay, que muestre el contenido, si no lo hay, 
que ponga una redirección.

<?php

session_id('cursillos');
session_start();

// id_curso : Calculo V (por ejemplo)
$curso = 10

// validando... $_SESSION es para ponerle challa solamente
// puedes usar perfectamente $_POST o la variable en la que
// estás pasando el RUT... eso, claro, depende de tu código.

$sql = "select count(*) from alumnocurso where id_curso = ".$curso." and 
  $rut = ".$_SESSION['rut_alumno'];

// En resumen estás contando si hay registros. Eso te va a generar
// solamente un resultado que puede ser 0 o 1. Si es cero, deniega.
// yo estoy usando adodb.sourceforge.net asi que perdona la notacion.

if($rs->fields[0] = 0)
{
	header('Location: nopermitido.html');
	exit();
}
?>
<html><head><title>Saludos!!!</title>

...
Creo que es suficiente con esta respuesta, dado que tu problema es más 
que nada de modelamiento.

> Gracias a todos por si tiempo. Espero haber sido claro.
> Saludos!
> 
> -- 
> Luis Vega M.
> Linux Registered User #356394
> GnuPG v1.4.1-1 (Debian GNU/Linux)
> PG-ID: C0778DD2 <fodsite AT gmail DOT com>
> http://fodsite.webcindario.com <http://fodsite.webcindario.com>


-- 
Rodrigo Fuentealba Cartes
Tecnico Analista Programador
Registered User #387639 - http://counter.li.org


Más información sobre la lista de distribución PHP