Ver Mensaje Individual
  #14 (permalink)  
Antiguo 23/02/2012, 01:18
Avatar de repara2
repara2
 
Fecha de Ingreso: septiembre-2010
Ubicación: München
Mensajes: 2.445
Antigüedad: 13 años, 7 meses
Puntos: 331
Respuesta: Sistemas de avisos

En el ejemplo que te mandé tienes una tabla usuarios que puedes extender sin problemas.
La solcuißon correcta siguiendo con el mismo modelo sería:
1. Agregar una tabla TIPO DE USUARIOs o similar, algo como:
id nombre
1 Admin
2 Premium
3 Normal
4 Otro

2. En la tabla usuarios, agregas un campo que puede ser, por ejemplo, tipo_id y que hace referencia al ID DE TIPO DE USUARIO de la tabla tipo de usuarios. Así, la tabla usuarios quedaría así:

CREATE TABLE `users` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'Id unico',
`login` char(8) DEFAULT NULL COMMENT 'el nombre de usuario en el sistema',
`name` varchar(64) DEFAULT NULL COMMENT 'nombre real',
`surname` varchar(64) DEFAULT NULL COMMENT 'apellido',
`password` char(8) DEFAULT NULL COMMENT 'password',
`tipo` int(11) DEFAULT NULL COMMENT 'Tipo de usuario',
PRIMARY KEY (`id`),
KEY `FK_users_tipo` (`tipo`),
CONSTRAINT `FK_users_tipo` FOREIGN KEY (`tipo`) REFERENCES `tipo_usuarios` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1


La DB completa quedará así:

Código MySQL:
Ver original
  1. CREATE DATABASE /*!32312 IF NOT EXISTS*/`mensajes` /*!40100 DEFAULT CHARACTER SET latin1 */;
  2.  
  3. USE `mensajes`;
  4.  
  5. /*Table structure for table `folders` */
  6.  
  7. DROP TABLE IF EXISTS `folders`;
  8.  
  9. CREATE TABLE `folders` (
  10.   `id` INT(11) NOT NULL AUTO_INCREMENT,
  11.   `name` VARCHAR(64) DEFAULT NULL COMMENT 'Nombre',
  12.   PRIMARY KEY (`id`)
  13.  
  14. /*Data for the table `folders` */
  15.  
  16. INSERT  INTO `folders`(`id`,`name`) VALUES (1,'Entrada'),(2,'Enviados'),(3,'Trabajo'),(4,'Importantes');
  17.  
  18. /*Table structure for table `messages` */
  19.  
  20. DROP TABLE IF EXISTS `messages`;
  21.  
  22. CREATE TABLE `messages` (
  23.   `id` INT(11) NOT NULL AUTO_INCREMENT COMMENT 'Id unico',
  24.   `subject` VARCHAR(128) DEFAULT NULL COMMENT 'Asunto',
  25.   `body` TEXT COMMENT 'Cuerpo del mensaje',
  26.   `to` INT(11) DEFAULT NULL COMMENT 'emisor, id de usuario',
  27.   `from` INT(11) DEFAULT NULL COMMENT 'receptor, id de usuario',
  28.   `sended_on` DATETIME DEFAULT NULL COMMENT 'fecha de envio',
  29.   `read` TINYINT(1) DEFAULT NULL COMMENT '1 si el mensaje fue leido por el destinatario, 0 caso contrario',
  30.   `folder_id` INT(11) DEFAULT NULL COMMENT 'La carpeta donde se encuentra el mensaje',
  31.   `owner` INT(11) DEFAULT NULL COMMENT 'Propietario del mensaje',
  32.   PRIMARY KEY (`id`),
  33.   KEY `FK_messages_from` (`from`),
  34.   KEY `FK_messages_to` (`to`),
  35.   KEY `FK_messages` (`folder_id`),
  36.   KEY `FK_messages_owner` (`owner`),
  37.   CONSTRAINT `FK_messages` FOREIGN KEY (`folder_id`) REFERENCES `folders` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
  38.   CONSTRAINT `FK_messages_from` FOREIGN KEY (`from`) REFERENCES `users` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION,
  39.   CONSTRAINT `FK_messages_owner` FOREIGN KEY (`owner`) REFERENCES `users` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION,
  40.   CONSTRAINT `FK_messages_to` FOREIGN KEY (`to`) REFERENCES `users` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
  41.  
  42. /*Data for the table `messages` */
  43.  
  44. INSERT  INTO `messages`(`id`,`subject`,`body`,`to`,`from`,`sended_on`,`read`,`folder_id`,`owner`) VALUES (1,'loco','Loco dsf adsf asdfdsafdsaf',1,2,'0000-00-00 00:00:00',0,1,1);
  45.  
  46. /*Table structure for table `tipo_usuarios` */
  47.  
  48. DROP TABLE IF EXISTS `tipo_usuarios`;
  49.  
  50. CREATE TABLE `tipo_usuarios` (
  51.   `id` INT(11) NOT NULL AUTO_INCREMENT COMMENT 'UNique id',
  52.   `nombre` VARCHAR(32) DEFAULT NULL COMMENT 'descripcion',
  53.   PRIMARY KEY (`id`),
  54.   CONSTRAINT `FK_tipo_usuarios` FOREIGN KEY (`id`) REFERENCES `users` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
  55.  
  56. /*Data for the table `tipo_usuarios` */
  57.  
  58. INSERT  INTO `tipo_usuarios`(`id`,`nombre`) VALUES (1,'Admin'),(2,'Normal'),(3,'Premium');
  59.  
  60. /*Table structure for table `users` */
  61.  
  62. DROP TABLE IF EXISTS `users`;
  63.  
  64. CREATE TABLE `users` (
  65.   `id` INT(11) NOT NULL AUTO_INCREMENT COMMENT 'Id unico',
  66.   `login` CHAR(8) DEFAULT NULL COMMENT 'el nombre de usuario en el sistema',
  67.   `name` VARCHAR(64) DEFAULT NULL COMMENT 'nombre real',
  68.   `surname` VARCHAR(64) DEFAULT NULL COMMENT 'apellido',
  69.   `password` CHAR(8) DEFAULT NULL COMMENT 'password',
  70.   `tipo` INT(11) DEFAULT NULL COMMENT 'Tipo de usuario',
  71.   PRIMARY KEY (`id`),
  72.   KEY `FK_users_tipo` (`tipo`),
  73.   CONSTRAINT `FK_users_tipo` FOREIGN KEY (`tipo`) REFERENCES `tipo_usuarios` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
  74.  
  75. /*Data for the table `users` */
  76.  
  77. INSERT  INTO `users`(`id`,`login`,`name`,`surname`,`password`,`tipo`) VALUES (1,'user_a','Jose','Josete','12345678',1),(2,'user_b','Pepe','Parada','12345678',2),(3,'user_c','Carlos','Carlongo','12345678',3);

Para obtener los datos del usuario Y el tipo de usuario, utilizas esto:

Código MySQL:
Ver original
  1. SELECT U.*, T.nombre FROM users U LEFT JOIN tipo_usuarios T ON (U.tipo = T.id)

Saludos,
__________________
Fere libenter homines, id quod volunt, credunt.