Ver Mensaje Individual
  #12 (permalink)  
Antiguo 21/02/2012, 13:10
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

Vamos a suponer para este ejemplo que estamos con un sistema de mensajería. Esencialmente un mail, un aviso o un
sms son la misma cosa. Tienen un emisor, un receptor y un texto.
En este caso concreto emularemos la funcionalidad de cualquier cliente de correo como Hotmail, Gmail, etc, a
saber:
Un usuario logeado en el sistema puede enviar y recibir mensajes.
Los mensajes se pueden mover a distintas carpetas o eliminar.
Los mensajes se pueden contestas o reenviar a un destinatario cualquiera.

NO vamos a entrar en temas de diseño, objetos, patrones, etc... esta es la versiń más básica posible.

Según lo anterior, necesitamos:
0. Una tabla usuarios para identificarlos en el sistema, caso contrario no se podrían identificar los mensajes.
Es decir, necesito saber quién envía y quién recibe, si no, no tengo sistema de mensajes ni nada.Esta tabla se puede extender para agregar más atributos según sea necesario, para este ejemplo es suficiente.
1. Tabla para los mensajes, que llamaremos 'messages':
Nótese que los campos emisor y receptor hacen referencia a los id de usuario de la tabla 'users'.
De todos los campos, reuiqere especial atención el campo owner. Este campo indica el propietario del mensaje, para comprender este tema hay que pensar en el envio de un mail:

Usuario A envía a usuario Z un email.
Usuario Z recibe el email en su Bandeja de entrada.
Usuario A guarda una copia de ese mensaje en la carpeta 'Enviados'.
Por tanto, tenemos DOS MENSAJES. Como existen dos registros distintos y separados cada usuario puede hacer con el mensaje lo que quiera sin afectar a los otros.
Si por el contrario guardamos sólo una copia del mensaje, entonces si Usuario A lo borra o lo mueve a la carpeta 'Importantes', entonces usuario Z no encontraría el mensaje.
De aquí la necesidad de tener siempre DOS mensajes, o sea, DOS registros de mensaje.
Este enfoque evita la necesidad de más tablas.

2. Una tabla de carpetas. Esta tabla tiene la unica finalidad de guardar nombres de carpetas, de esta manera puedo referenciar las carpetas por id y no por nombre que no tiene sentido. Nótese que una 'carpeta' al estilo Hotmail (bandeja de entrada, eliminados, etc) funciona de la misma manera que un 'estado' o 'atributo' de un mensaje. Es decir que es simplemente un dato para clasificar el elemento mensaje.

De esta forma, la DB quedaría 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,'Personales'),(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_owner` FOREIGN KEY (`owner`) REFERENCES `users` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION,
  38.   CONSTRAINT `FK_messages` FOREIGN KEY (`folder_id`) REFERENCES `folders` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
  39.   CONSTRAINT `FK_messages_from` FOREIGN KEY (`from`) 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. /*Table structure for table `users` */
  45.  
  46. DROP TABLE IF EXISTS `users`;
  47.  
  48. CREATE TABLE `users` (
  49.   `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'Id unico',
  50.   `login` char(8) DEFAULT NULL COMMENT 'el nombre de usuario en el sistema',
  51.   `name` varchar(64) DEFAULT NULL COMMENT 'nombre real',
  52.   `surname` varchar(64) DEFAULT NULL COMMENT 'apellido',
  53.   `password` char(8) DEFAULT NULL COMMENT 'password',
  54.   PRIMARY KEY (`id`)
  55.  
  56. /*Data for the table `users` */
  57.  
  58. insert  into `users`(`id`,`login`,`name`,`surname`,`password`) values (1,'user_a','Jose','Josete','12345687'),(2,'user_b','Pepe','Parada','12345678'),(3,'user_c','Carlos','Carlongo','12345678');
  59.  
  60. /*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
  61. /*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
  62. /*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
  63. /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;


Según lo dicho, las funciones mínimas que nos hacen falta son:

enviarMensaje($from, $to, $subject, $body) //envia un mensaje de from a to
eliminarMensaje($mensaje) //Elimina mensaje del buzón
moverMensaje($mensaje, $carpeta) //Mueve el mensaje a la carpeta indicada
listarCarpeta($carpeta, $usuario) //muestra la carpeta del usuario indicado

Otras funciones:
login($user, $password) //acceso a la app
listarCarpetas() //Devuelve todas las carpetas para un usuario

//extender aquí tanto como sea necesario

Los archivos que se necesitan para este ejemplo son
db.php //archivo con la info de conexión a la base de datos
funciones.php //Las funciones antes listadas
index.php //El archivo principal
login.php //Archivo de login
enviar.php //Archivo con el formulario de envio de un mensaje

Todo el código completo está aqui.
Tarea para el hogar:
0. configurar el archivo db.php antes de usarlo y comprobar todo el código
1. terminar la aplicación.
2. estudiar co*o!!!
3. no me vengas con mensajes de error ni tonterías, el código funciona

Mañana no creo que me conecte pero si tienes algo postea, saludos
__________________
Fere libenter homines, id quod volunt, credunt.