Envio de mensajes entre usuarios o amigos (Modelo Entidad-Relacion)

Iniciado por sReOn_1R, 3 Diciembre 2009, 02:06 AM

0 Miembros y 1 Visitante están viendo este tema.

sReOn_1R

Hola estoy enterandome sobre el Modelo entidad relacion para crear BBDD y me gustaría hacer que un usuario (Tabla usuarios) envíe mensajes a otro usuario que tiene como amigo, ¿Como se haria,sería una relacion reflexiva entre tabla usuarios y luego la tabla usuarios se haria una relación con una tabla de mensajes? Estoy hecho un lio espero que me puedan ayudar  :-\





sReOn_1r

^Tifa^

Aunque no entiendo del todo tu peticion. Lo que he entendido es, que tienes dos tablas una de Usuarios (Amigos) y otra donde llegaran los Mensajes:

Código (sql) [Seleccionar]


mysql> describe Mensajes;
+-------------+--------------+------+-----+---------+-------+
| Field       | Type         | Null | Key | Default | Extra |
+-------------+--------------+------+-----+---------+-------+
| id_mensajes | tinyint(4)   | YES  |     | NULL    |       |
| id_amigo    | tinyint(4)   | YES  | MUL | NULL    |       |
| mensaje     | varchar(100) | YES  |     | NULL    |       |
+-------------+--------------+------+-----+---------+-------+
3 rows in set (0.00 sec)


mysql> describe Usuarios;
+----------+------------+------+-----+---------+----------------+
| Field    | Type       | Null | Key | Default | Extra          |
+----------+------------+------+-----+---------+----------------+
| id_amigo | tinyint(4) | NO   | PRI | NULL    | auto_increment |
| amigo    | char(20)   | YES  |     | NULL    |                |
+----------+------------+------+-----+---------+----------------+
2 rows in set (0.00 sec)



Lo anterior es solo un ejemplo, 1 usuario (1 amigo) puede enviarle 1 mensaje a un amigo, y 1 amigo puede tener varios mensajes. (En el ejemplo que voy a exponerte)

La tabla Usuarios tiene los siguientes registros:

Código (sql) [Seleccionar]


mysql> select * from Usuarios;
+----------+----------+
| id_amigo | amigo    |
+----------+----------+
|        1 | Fernando |
|        2 | Mario    |
|        3 | Maritza  |
|        4 | Juan     |
|        5 | Juana    |
+----------+----------+
5 rows in set (0.00 sec)



Y puedes se le envia por ejemplo algunos mensajes a Fernando y Maritza:

Código (sql) [Seleccionar]

mysql> insert into Mensajes values(1,1,'Hola Fernando solamente pasaba a saludarte'), (1,1,'Hola Fer!, como vas');

mysql> insert into Mensajes values(3,3,'Maritza no te olvides de sacar la basura'), (3,3,'Hola Maritza nos vemos manana'), (3,3,'Maritz Llamame pronto!!..Carlos');


Ahora la tabla Mensajes tendria:

Código (sql) [Seleccionar]

mysql> select * from Mensajes;
+-------------+----------+--------------------------------------------+
| id_mensajes | id_amigo | mensaje                                    |
+-------------+----------+--------------------------------------------+
|           1 |        1 | Hola Fernando solamente pasaba a saludarte |
|           1 |        1 | Hola Fer!, como vas                        |
|           3 |        3 | Maritza no te olvides de sacar la basura   |
|           3 |        3 | Hola Maritza nos vemos manana              |
|           3 |        3 | Maritz Llamame pronto!!..Carlos            |
+-------------+----------+--------------------------------------------+
5 rows in set (0.00 sec)



Donde id_amigo corresponde al id_amigo de la tabla Usuarios. Ahora para que Fernando y Maritza lean sus mensajes:

Código (sql) [Seleccionar]

mysql> select Usuarios.amigo, Mensajes.mensaje from Usuarios natural join Mensajes;
+----------+--------------------------------------------+
| amigo    | mensaje                                    |
+----------+--------------------------------------------+
| Fernando | Hola Fernando solamente pasaba a saludarte |
| Fernando | Hola Fer!, como vas                        |
| Maritza  | Maritza no te olvides de sacar la basura   |
| Maritza  | Hola Maritza nos vemos manana              |
| Maritza  | Maritz Llamame pronto!!..Carlos            |
+----------+--------------------------------------------+



O para que solo Fernando vea sus mensajes:

Código (sql) [Seleccionar]

mysql> select Usuarios.amigo, Mensajes.mensaje from Usuarios inner join Mensajes where Usuarios.id_amigo = 1 and Mensajes.id_amigo = Usuarios.id_amigo;
+----------+--------------------------------------------+
| amigo    | mensaje                                    |
+----------+--------------------------------------------+
| Fernando | Hola Fernando solamente pasaba a saludarte |
| Fernando | Hola Fer!, como vas                        |
+----------+--------------------------------------------+
2 rows in set (0.00 sec)


sReOn_1R

Gracias por responder ;) aunque no entiendo bien la respuesta ya que todavía no sé mysql,lo aprenderé a partir de Enero,mas bien busco el Modelo Entidad-Relacion.
Lo que quiero hacer es que haya usuarios, y que cada uno de ellos puedan tener amigos (yo entiendo que esto seria una relación reflexiva en la tabla usuarios que sería relacion tipo NM porque un usuario puede tener varios usuarios o amigos y un usuario o amigo pueden tener varios usuarios).
Pero el problema viene a cuando quiero que entre los amigos se envien mensajes,y nosé bien donde poner una relación entre la tabla usuarios, la tabla amistades( ya que al ser tipo NM se generaría una tabla nueva a la que llamaria amistades) y la tabla mensajes..
¿Podríais ayudarme?Gracias

PD: Perdon por tardar tanto en responder pero no entendía lo que me habias puesto porque por el momento no sé mysql y al final sigo sin entenderlo bien





sReOn_1r

Nakp

el n-n se resuelve asi:

usuario --< amistad >-- amigos

y suponiendo que solo se pueden enviar mensajes entre amigos:

amistad --< mensajes
Ojo por ojo, y el mundo acabará ciego.

^Tifa^

Citaryo entiendo que esto seria una relación reflexiva en la tabla usuarios que sería relacion tipo NM porque un usuario puede tener varios usuarios o amigos y un usuario o amigo pueden tener varios usuarios

Haber, un usuario puede tener varios amigos (una entidad puede relacionarse a varias entidades). Pero un amigo no puede tener varios usuarios  :-\  sino un solo usuario, cuando te registras en cualquier web se te asigna un usuario unico, no varios, lo que si se te permite es volver a registrar un usuario nuevo para tener mas de uno (Pero no tendria mucha logica ya que independientemente aunque yo tuviera 3 usuarios creados por ejemplo en este foro, cada uno seria independiente, unico y con sus caracteristicas individuales propias  :xD ). Entonces, seguiria mirando en tu caso la posibilidad de 3 tablas.

Usuarios
Mensajes
Amigos

Mi ejemplo expuesto (Aunque esta realizado en puro consultas SQL) podria servirte de base, lo que me parece que buscas es el 'Diagrama Entidad-Relacion' de eso que expuse mas arriba con consultas SQL.

Me temo que tengo una falla enorme con diagramar este tipo de situaciones y no soy muy amiga de los diagramas de flujo... pero mas o menos por ahi va el camino.

Usuario se relaciona a Mensajes y Amigos se relaciona a Mensajes.

Mensajes vendria siendo la tabla intermedio de relacion entre las dos (usuarios y amigos).

Nakp

mensajes podria depender de una amistad, si no, seria la misma relación que define amistad pero no se puede tomar a mensajes como amistad
Ojo por ojo, y el mundo acabará ciego.

Novlucker

#6
No me gustan los MER :¬¬

¿Así?

En el pasaje a tablas quedarían 3 tablas, Personas (clientes), Amistad (con los id y demás atributos determinantes de las Personas), y Mensajes :-\

Saludos
Contribuye con la limpieza del foro, reporta los "casos perdidos" a un MOD XD

"Hay dos cosas infinitas: el Universo y la estupidez  humana. Y de la primera no estoy muy seguro."
Albert Einstein

MazarD

En estos problemas lo más importante es el enunciado, y aquí está muy poco claro, pero dado que yo entiendo los mensajes se envian entre amigos creo que sería:

-Entidad persona
-Amistad relación reflexiva simétrica de persona n-m
-Entidad Mensajes
Al añadir esta última se crearía una asociativa de mensajes con amistad 1-n

Siento no poder hacer el dibujito, pero se entiende.

Del modo anterior al pasar al modelo relacional quedaría:

Persona(dni, nombre, blablabla)
Amistad(dni,dni_amigo,donde_se_conocieron)
Mensajes(dni,dni_amigo,mensaje) donde dni,dni_amigo forana hacía Amistad

Sino se podría quitar la asociativa y que amistad fuera entidad, sería un esquema entidad/relación equivalente y el modelo relacional sería el mismo.

Saludos!

-Learn as if you were to live forever, live as if you were to die tomorrow-

http://www.mazard.info
http://twitter.com/MazarD
irc://irc.freenode.org/elhacker.net

^Tifa^

Si esta buscando el 'dibujito' que me parece que eso es lo que el inicialmente esta buscando el diagrama de entidad-relacion de su peticion.

El de Novlucker le podria servir de modelo  :-*

A mi tampoco me gustan para nada los diagramas.

MazarD

CitarSi esta buscando el 'dibujito' que me parece que eso es lo que el inicialmente esta buscando el diagrama de entidad-relacion de su peticion.
Este es mi dibujito, sin dibujito:
Citar
-Entidad persona
-Amistad relación reflexiva simétrica de persona n-m
-Entidad Mensajes
Al añadir esta última se crearía una asociativa de mensajes con amistad 1-n
Con esto ya es trivial dibujarlo.

Pero ya puestos:


:laugh:

La otra opción que comento sería substituyendo la asociativa por entidad normal.


Y el modelo relacional que ya había puesto:
Citar
Persona(dni, nombre, blablabla)
Amistad(dni,dni_amigo,donde_se_conocieron)
Mensajes(dni,dni_amigo,mensaje) donde dni,dni_amigo forana hacía Amistad
Que NO es lo mismo que la estructura de las tablas en sql como se suele confundir :P

CitarA mi tampoco me gustan para nada los diagramas.
Pues en realidad a mi me gustan bastante, es el modo más claro y cómodo para diseñar una base de datos

Saludos!
-Learn as if you were to live forever, live as if you were to die tomorrow-

http://www.mazard.info
http://twitter.com/MazarD
irc://irc.freenode.org/elhacker.net