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 originalCREATE DATABASE /*!32312 IF NOT EXISTS*/`mensajes` /*!40100 DEFAULT CHARACTER SET latin1 */;
/*Table structure for table `folders` */
/*Data for the table `folders` */
INSERT INTO `folders`(`id`,`name`) VALUES (1,'Entrada'),(2,'Personales'),(3,'Trabajo'),(4,'Importantes');
/*Table structure for table `messages` */
KEY `FK_messages_from` (`from`), KEY `FK_messages_to` (`to`), KEY `FK_messages` (`folder_id`), KEY `FK_messages_owner` (`owner`),
/*Data for the table `messages` */
/*Table structure for table `users` */
/*Data for the table `users` */
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');
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!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