10 messages in com.mysql.lists.mysql-esRe: Algunas preguntas tontas
FromSent OnAttachments
Reynier Perez Mira29 Jun 2006 06:31 
Bonjo29 Jun 2006 09:26 
Alvaro Cobo29 Jun 2006 21:05 
Alvaro Cobo29 Jun 2006 21:08 
alexis sifuentes alarcón10 Jul 2006 11:32 
Reynier Perez Mira10 Jul 2006 20:43 
Alvaro Cobo10 Jul 2006 22:42 
Alvaro Cobo11 Jul 2006 21:48 
Reynier Perez Mira17 Jul 2006 07:50 
Alvaro Cobo17 Jul 2006 09:43 
Subject:Re: Algunas preguntas tontas
From:Alvaro Cobo (cobo@gmail.com)
Date:06/29/2006 09:05:52 PM
List:com.mysql.lists.mysql-es

Bonjo escribió:

Reynier Perez Mira <rper@estudiantes.uci.cu> escribió: Bueno muchos pensarán
que estas preguntas que les voy a hacer son un poco tontas pero bueno he estado
trabajando con Base de Datos desde mi 1er año en la Universidad y a estas
alturas (4to) no se que significa lo que les voy a preguntar.

[...]

Supongan el siguiente caso: Tengo una tabla "roles" en la cual almaceno los roles del sistema: (1) Administrador (2) Webmaster (3) Profesor (4) Editor (5) Usuario y/o Alumno (aún por definir)

Y otra tabla "usuarios". Ahora la relación que se me ocurre entre ambas tablas
es 1:N, o sea un usuario puede tener uno o más roles. Por ejemplo el usuario:
"administrador" podría tener los roles de: administrador, webmaster, editor y
profesor, un poco ambiguo porque se supone que administrador sea el máximo pero
bueno es para ejemplificar.

Entonces que pasa si elimino uno de esos roles en la tabla "roles". Como podría
eliminar ese rol en la tabla usuarios luego?

Espero me puedan explicar que significa cada uno de estos tipos de relaciones y
como lograr lo que quiero.

[...]

Yo lo veo de la siguiente manera ------------- -------------- | Roles | >-N----1--| Usuarios | ------------- --------------

Entonces lo único que debes hacer es agregar la clave primaria de la tabla roles
a la tabla usuarios, como la típica relacion cabecera detalle, claro, si lo que
compredi está correcto. Ya lo diras tu.

Hola Reyner:

No lei a profundidad el caso que propones, pero me parece que estamos frente a una relacion Muchos:Muchos, es decir, un usuario puede tener muchos roles, y un rol puede ser asumido por varios usuarios. Normalmente eso se solventa con una tabla intermedia, en la que estableces la relacion entre estas dos tablas:

Por ejemplo:

CREATE TABLE `rol` ( `pk_rol` int(11) NOT NULL auto_increment, `rol` varchar(60) collate latin1_spanish_ci NOT NULL, PRIMARY KEY (`pk_rol`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_spanish_ci COMMENT='Tabla de roles' AUTO_INCREMENT=3 ;

CREATE TABLE `usuario` ( `id_usuario` int(11) NOT NULL auto_increment, `nombre_usuario` varchar(150) collate latin1_spanish_ci NOT NULL, PRIMARY KEY (`id_usuario`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_spanish_ci COMMENT='Tabla de usuarios' AUTO_INCREMENT=3 ;

CREATE TABLE `rol_usuario` ( `fk_usuario` int(11) NOT NULL, `fk_rol` int(11) NOT NULL, KEY `fk_usuario` (`fk_usuario`), KEY `fk_rol` (`fk_rol`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_spanish_ci COMMENT='Tabla de union (relacion muchos a muchos)';

ALTER TABLE `rol_usuario` ADD CONSTRAINT `rol_usuario_ibfk_2` FOREIGN KEY (`fk_rol`) REFERENCES `rol` (`pk_rol`) ON DELETE CASCADE ON UPDATE CASCADE, ADD CONSTRAINT `rol_usuario_ibfk_1` FOREIGN KEY (`fk_usuario`) REFERENCES `usuario` (`id_usuario`) ON DELETE CASCADE ON UPDATE CASCADE;

Es decir, en la tabla "rol_usuario" vamos a almacenar las relaciones muchos a muchos. Es en esta tabla en donde se especifica que el usuario Juan, es profesor y administrador al mismo tiempo.

Ya en el nivel de aplicación puedes crear un formulario intermedio en el que por cada persona vas agregando las funciones que le competen. POr ejemplo, en PHP yo generaría una pagina con el indice de los usuarios, y con un vinculo envias una variable $_GET con el id_usuario, y en el formulario una tabla editable en donde vas asignando los diferentes roles a la persona.

Espero haberte ayudado y espero comentarios de los/las compañeros/as de la lista.

Saludos,

Alvaro