elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Introducción a Git (Primera Parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Desarrollo Web
| | |-+  Bases de Datos (Moderador: Carloswaldo)
| | | |-+  Envio de mensajes entre usuarios o amigos (Modelo Entidad-Relacion)
0 Usuarios y 2 Visitantes están viendo este tema.
Páginas: 1 2 [3] Ir Abajo Respuesta Imprimir
Autor Tema: Envio de mensajes entre usuarios o amigos (Modelo Entidad-Relacion)  (Leído 23,031 veces)
^Tifa^


Desconectado Desconectado

Mensajes: 2.804


Ver Perfil
Re: Envio de mensajes entre usuarios o amigos (Modelo Entidad-Relacion)
« Respuesta #20 en: 3 Enero 2010, 01:09 am »

Imagina que tengo estas 2 Tablas con los siguientes datos:

Código
  1. mysql> SELECT * FROM relacion;
  2. +------+--------+--------+    
  3. | id   | codigo | nombre |    
  4. +------+--------+--------+    
  5. |    1 |      2 | Luis   |    
  6. |    1 |      3 | Marta  |    
  7. |    2 |      4 | Jose   |    
  8. |    2 |      1 | Marian |    
  9. +------+--------+--------+    
  10. 4 ROWS IN SET (0.00 sec)      
  11.  
  12. mysql> SELECT * FROM usuarios;
  13. +----+--------+              
  14. | id | nombre |              
  15. +----+--------+
  16. |  1 | Marian |
  17. |  2 | Luis   |
  18. |  3 | Marta  |
  19. |  4 | Jose   |
  20. +----+--------+
  21. 4 ROWS IN SET (0.00 sec)
  22.  

Y yo quiero controlar que cuando actualize o elimine un dato de la tabla usuarios se aplique en la tabla relacion
justo como lo haria las tablas si usase un motor de almacenamiento transaccional como InnoDB, la diferencia es que
estas 2 tablas estan bajo el motor no transaccional Myisam... entonces como tu controlas esto? con la creacion de
triggers como te venia comentando:

Código
  1. mysql> delimiter /
  2. mysql> CREATE TRIGGER trigo
  3.    -> after UPDATE ON usuarios
  4.    -> FOR each ROW            
  5.    -> BEGIN                  
  6.    -> UPDATE relacion SET id = NEW.id WHERE id = OLD.id;
  7.    -> END;                                              
  8.    -> /                                                
  9. Query OK, 0 ROWS affected (0.06 sec)  
  10. mysql> delimiter ;
  11.  
  12. mysql> UPDATE usuarios SET id = 6 WHERE id = 1;
  13. Query OK, 1 ROW affected (0.04 sec)
  14. ROWS matched: 1  Changed: 1  Warnings: 0
  15.  
  16. mysql> SELECT * FROM relacion;
  17. +------+--------+--------+
  18. | id   | codigo | nombre |
  19. +------+--------+--------+
  20. |    6 |      2 | Luis   |
  21. |    6 |      3 | Marta  |
  22. |    2 |      4 | Jose   |
  23. |    2 |      1 | Marian |
  24. +------+--------+--------+
  25. 4 ROWS IN SET (0.00 sec)
  26.  
  27. mysql> SELECT * FROM usuarios;
  28. +----+--------+
  29. | id | nombre |
  30. +----+--------+
  31. |  6 | Marian |
  32. |  2 | Luis   |
  33. |  3 | Marta  |
  34. |  4 | Jose   |
  35. +----+--------+
  36. 4 ROWS IN SET (0.00 sec)
  37.  

Viste como actualice data en la tabla usuarios y automaticamente se aplico en la tabla relacion
como si estuviesen bajo un motor de almacenamiento transaccional, cuando no lo esta?
Ahora si quisieras aplicar el 'ON DELETE CASCADE' por ejemplo que si eliminas una fila en
la tabla usuarios tambien se elimine de forma automatica en la tabla relacion.

Código
  1. mysql> CREATE TRIGGER trigo1
  2.    -> after DELETE ON usuarios
  3.    -> FOR each ROW
  4.    -> BEGIN
  5.    -> DELETE FROM relacion WHERE id = OLD.id;
  6.    -> END;
  7.    -> /
  8. Query OK, 0 ROWS affected (0.40 sec)
  9.  
  10. mysql> delimiter ;
  11.  
  12. mysql> DELETE FROM usuarios WHERE id = 2;
  13. Query OK, 1 ROW affected (0.00 sec)
  14.  
  15. mysql> SELECT * FROM usuarios;
  16. +----+--------+
  17. | id | nombre |
  18. +----+--------+
  19. |  6 | Marian |
  20. |  3 | Marta  |
  21. |  4 | Jose   |
  22. +----+--------+
  23. 3 ROWS IN SET (0.00 sec)
  24.  
  25. mysql> SELECT * FROM relacion;
  26. +------+--------+--------+
  27. | id   | codigo | nombre |
  28. +------+--------+--------+
  29. |    6 |      2 | Luis   |
  30. |    6 |      3 | Marta  |
  31. +------+--------+--------+
  32. 2 ROWS IN SET (0.00 sec)
  33.  
  34.  

Lo anterior expuesto, no fuese posible de realizar sino existiera una relacion de identidad iguales de campos entre el campo ID de ambas tablas. Los datos no tienen que estas de manera obligatoria sobre tablas con motor InnoDB para poder funcionar (A nivel de relacion) como un motor transaccional lo haria. Pero especifico a nivel de relacion de campos no al nivel de todas las funcionalidades que posee un motor transaccional real como son los indices clustered en vez de b-tree, el lockeo de filas en vez de toda la tabla, entre otras cositas internas que poseen los motores transaccionales que no sera aplicable en motores no transaccionales, pero... en el caso que pides no es requerido exponer esto ni abundar tanto, lo que pides se puede controlar con TRIGGERS en motores no transaccionales como puedes ver... y obviamente asi como controlas que campos se actualizan y eliminan de la tabla relacion cuando hacemos algo en la tabla usuarios, puedes crear TRIGGERS que impidan que se actualice o elimine campos sobre relacion sino se ha aplicado nada en la tabla usuarios.



En línea

дٳŦ٭
GNU/Linux Infrastructure Specialist
Ex-Staff
*
Desconectado Desconectado

Mensajes: 5.110


Ver Perfil WWW
Re: Envio de mensajes entre usuarios o amigos (Modelo Entidad-Relacion)
« Respuesta #21 en: 3 Enero 2010, 03:04 am »

MMMM a ver.. no estoy entendiendo... según yo no las tienes creadas, ya que myisam no te las crea, de hecho no existen con ese motor... mira, con innodb:

Código
  1. mysql> SELECT * FROM `vendor_comment` PROCEDURE ANALYSE ( );
  2. +---------------------------------+-----------------------------+------------------------------+------------+------------+------------------+-------+-------------------------+--------+---------------------------------------------------------------------------------------------------------------+
  3. | Field_name                      | Min_value                   | Max_value                    | Min_length | Max_length | Empties_or_zeros | NULLS | Avg_value_or_avg_length | Std    | Optimal_fieldtype                                                                                             |
  4. +---------------------------------+-----------------------------+------------------------------+------------+------------+------------------+-------+-------------------------+--------+---------------------------------------------------------------------------------------------------------------+
  5. | vsi.vendor_comment.id_vendor    | 1                           | 3                            |          1 |          1 |                0 |     0 | 2.0000                  | 0.8165 | ENUM('1','2','3') NOT NULL                                                                                    |
  6. | vsi.vendor_comment.id_buyer     | 1                           | 1                            |          1 |          1 |                0 |     0 | 1.0000                  | 0.0000 | ENUM('1') NOT NULL                                                                                            |
  7. | vsi.vendor_comment.comment      | Buyer 1 comment TO CocaCola | Buyer 1 comment TO Microsoft |         27 |         31 |                0 |     0 | 28.6667                 | NULL   | ENUM('Buyer 1 comment to CocaCola','Buyer 1 comment to Ideas de Web','Buyer 1 comment to Microsoft') NOT NULL |
  8. | vsi.vendor_comment.registration | 2009-12-31                  | 2009-12-31                   |         10 |         10 |                0 |     0 | 10.0000                 | NULL   | ENUM('2009-12-31') NOT NULL                                                                                   |
  9. +---------------------------------+-----------------------------+------------------------------+------------+------------+------------------+-------+-------------------------+--------+---------------------------------------------------------------------------------------------------------------+
  10. 4 ROWS IN SET (0.00 sec)
  11.  
  12.  


En línea

^Tifa^


Desconectado Desconectado

Mensajes: 2.804


Ver Perfil
Re: Envio de mensajes entre usuarios o amigos (Modelo Entidad-Relacion)
« Respuesta #22 en: 3 Enero 2010, 04:36 am »

No se en que punto todavia no te aclaras....

En las tablas que yo he creado de ejemplo, hay una relacion el campo ID de ambas tablas, vamos que no es tan dificil de ver  :xD

Dejame intentar desglosar porque creo que tienes una pekena confusion en cuanto a las relaciones de entidades y si un motor es o no transaccional. Basandome en la manera como tu percibes cuando unos datos estan o no relacionados en varias tablas (que para ti solo aplican si el motor es transaccional) el ejemplo posteado por mi, y por casi todos los demas (sino todos) tambien estan erroneos. Porque ellos se basaron en el modelo entidad-relacion de datos, ellos no se han basado de si el motor es o no transaccional, son dos cosas distintas.

Cuando te dicen que un motor de almacenamiento es transaccional te estan diciendo que tiene unas funcionalidades (No las voy a describir todas aqui que conste, solo las basicas para ver si te aclaras un poco) dentro de estas funcionalidades existe el control de forma automatica entre 2  o mas tablas, donde hay una tabla 'padre' y una tabla 'hijo' este control lo que hace es precisamente, que si se actualiza o elimina un dato en la tabla padre aplica automaticamente a la tabla hijo (Siempre y cuando pusieras dicha condicion a la tabla hijo con ON UPDATE y ON DELETE) ahora, si te fijas bien yo te he recreado de forma basica esa mismita funcionalidad en 2 tablas bajo motor NO transaccional, como lo hice?? con los TRIGGERS que te postee. Estoy en este caso haciendo lo mismo que si ambas tablas fuesen transaccionales (En este unico punto ojo que no quiero personas que asuman que estoy comparando transaccional vs no transaccional) lo unico que yo misma cree la condiciones con 2 TRIGGERS, mientras un motor transaccional como InnoDB lo hace ya por defecto de forma automatica porque esta programado a funcionar asi.

Cuando te dicen un motor No transacional, te estan diciendo que las funcionalidades de las cuales carece este motor es precisamente el control automatico de lo que ocurre entre la tabla padre o la tabla hijo (Hay mas diferencias que conste, pero no aplica extenderlas para lo que requieres aclararte). Por esta razon si yo tomo este modelo y lo coloco bajo un motor no transaccional, como yo controlo las transaciones de ahi me vere obligada a implementar de alguna manera las funcionalidades basicas que controlen los cambios de una tabla padre a una tabla hijo, por eso viste que cree 2 TRIGGERS sencillos que me manejaran los UPDATE y DELETE de la tabla padre hacia la tabla hijo.

Las relaciones entre tablas se basan por las entidades que componen las tablas llamase campos, no es obligatorio que este en un motor transacional o no, las relaciones de datos es una cosa, la funcionalidad de control sobre esos datos es otra cosa y te lo he expuesto mas arriba.
En línea

Páginas: 1 2 [3] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Ayuda con modelo entidad relación
Programación General
marcelosolera 0 2,254 Último mensaje 17 Junio 2012, 19:53 pm
por marcelosolera
Requiero de cualquier Modelo Entidad-Relacion
Bases de Datos
Hadess_inf 0 2,389 Último mensaje 6 Enero 2014, 18:31 pm
por Hadess_inf
MySQL WorkBench Modelo Entidad-Relacion
Bases de Datos
Winterz 0 2,421 Último mensaje 16 Julio 2014, 17:48 pm
por Winterz
Duda en la conversión de Modelo Entidad Relación a Modelo Relacional
Bases de Datos
theluigy13etv 1 4,379 Último mensaje 22 Mayo 2015, 19:33 pm
por ZeroVzla
BASE DE DATOS (Modelo Entidad Relacion)
Bases de Datos
NaxoHR 3 6,177 Último mensaje 29 Diciembre 2016, 13:51 pm
por crisoof
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines