Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

[SOLUCIONADO] Problema al Relacionar Tablas MySQL

Estas en el tema de Problema al Relacionar Tablas MySQL en el foro de Mysql en Foros del Web. Hola !!! Disculpen, tengo un problema, y es que no sé como se deben relacionar las tablas en MySQL ya que he intentado hacerlo de ...
  #1 (permalink)  
Antiguo 17/04/2014, 22:53
 
Fecha de Ingreso: octubre-2008
Mensajes: 147
Antigüedad: 15 años, 6 meses
Puntos: 3
Pregunta Problema al Relacionar Tablas MySQL

Hola !!!

Disculpen, tengo un problema, y es que no sé como se deben relacionar las tablas en MySQL ya que he intentado hacerlo de muchas formas y todo me sale mal...

Básicamente quisiera un poco de asesoría con un ejemplo que me ayuden a relacionar estas tablas que muestro para yo hacer lo demás...

Uso MySQL Workbench pero también intenté usar Diseñador de phpMyAdmin, y nada me ha salido como espero...

Básicamente quisiera apoyo para lograr por lo menos estos propósitos y yo así entender como debo relacionar el resto:


Esta es una imagen del diseño que según he hecho:



Estos son los archivos .sql (Exportado) y .mwb (MySQL Workbench) que he usado para crear las bases de datos:

SQL
MySQL Workbench


Tabla PanelControlModulos:
  • Sin Atributos especiales, unicamente su llave primaria (ID_Modulo con AutoIncremento)
Tabla PanelControlSecciones:
  • ID_Modulo debe estar relacionada con ID_Modulo de PanelControlModulos.
  • Si no existe el ID_Modulo insertado en el ID_Modulo de PanelControlModulos denegar la insersión.

Tabla PermosusSystemTLM:
  • Usuario_ID debe estar relacionado con Usuario_ID de la tabla UsuariosTLM
  • ID_SubMenu debe estar relacionado con ID_SubMenu de la tabla PanelControlSecciones
  • Si no existe el Usuario_ID insertado en el Usuario_ID de UsuariosTLM denegar la insersión
  • Si no existe el ID_SubMenu insertado en el ID_SubMenu de PanelControlSecciones denegar la insersión

Tabla UsuariosTLM:
  • TipoUsuario_U debe estar relacionado con ID_Tipo de la tabla TiposUsuariosTLM
  • Estatus_U debe estar relacionado con el ID_Estatus de la tabla EstatusUsuariosTLM
  • Sucursal_U debe estar relacionado con ID_Sucursal de la tabla SucursalesTLM
  • Si no existe el TipoUsuario_U insertado en el TipoUsuario_U de TiposUsuariosTLM denegar la insersión
  • Si no existe el Estatus_U insertado en el Estatus_U de EstatusUsuariosTLM denegar la insersión
  • Si no existe el Sucursal_U insertado en el Sucursal_U de SucursalesTLM denegar la insersión


Toda la ayuda que puedan proporcionarme para ayudarme a lograr mi objetivo se las agradeceré muchísimo.
  #2 (permalink)  
Antiguo 17/04/2014, 23:00
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Problema al Relacionar Tablas MySQL

Todo claro, menos una cosa: ¿Cuál es exactamente tu problema? ¿El uso de MySQL Workbench como herramienta de diseño? ¿O cómo se relacionan las tablas que tienes que crear?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 17/04/2014, 23:24
 
Fecha de Ingreso: octubre-2008
Mensajes: 147
Antigüedad: 15 años, 6 meses
Puntos: 3
Respuesta: Problema al Relacionar Tablas MySQL

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Todo claro, menos una cosa: ¿Cuál es exactamente tu problema? ¿El uso de MySQL Workbench como herramienta de diseño? ¿O cómo se relacionan las tablas que tienes que crear?
Hola que tal;

Mi problema es que no sé como relacionar las tablas, ni con MySQL Workbench ni phpMyAdmin...

Por ejemplo: Según yo las relacioné en el MySQL Workbench, pero cuando inserto un dato en una tabla donde no me debe dejar insertarlo porque no existe en otra, si me deja...

Y si borro un dato de una tabla que tiene dependientes, en teoria no me debería dejar, pero la borra y en las dependientes no les hace nada...

soy estudiante y no le entiendo muy bien, estas vacaciones he estado tratando de terminar mi proyecto para que no me coma el tiempo pero ando atorado en esto...

¿Alguna ayuda por favor?

----

Por ejemplo: La tabla de UsuariosTLM;

El propósito es este:

Tabla UsuariosTLM:
TipoUsuario_U debe estar relacionado con ID_Tipo de la tabla TiposUsuariosTLM
Estatus_U debe estar relacionado con el ID_Estatus de la tabla EstatusUsuariosTLM
Sucursal_U debe estar relacionado con ID_Sucursal de la tabla SucursalesTLM
Si no existe el TipoUsuario_U insertado en el TipoUsuario_U de TiposUsuariosTLM denegar la insersión
Si no existe el Estatus_U insertado en el Estatus_U de EstatusUsuariosTLM denegar la insersión
Si no existe el Sucursal_U insertado en el Sucursal_U de SucursalesTLM denegar la insersión

Pero no lo he logrado, las relaciones que he creado andan mal o algo así, entiendo la cardinalidad pero no como funcionan las relaciones en el MySQL Workbench porque pone muchos botoncitos y no se cual se le clicka primero o cuando usar cual :(


Última edición por dfmex; 17/04/2014 a las 23:29 Razón: Agregar información.
  #4 (permalink)  
Antiguo 17/04/2014, 23:32
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Problema al Relacionar Tablas MySQL

Cita:
Por ejemplo: Según yo las relacioné en el MySQL Workbench, pero cuando inserto un dato en una tabla donde no me debe dejar insertarlo porque no existe en otra, si me deja...

Y si borro un dato de una tabla que tiene dependientes, en teoria no me debería dejar, pero la borra y en las dependientes no les hace nada...
Ese nivel de restricciones sólo opera si las tablas son InnoDB, y se declararon las FK al crearlas o se les agregó luego de crearlas. Pero si el motor de tablas de MySQL que tienes en tu servidor es MyISAM, y no InnoDB, las FK no existen, ya que las MyISAM no las soporta.
No te olvides que MySQL no tiene un único motor de tablas, a diferencia de otros DBMS.
Todo esto está en el maual de referencia on-line de MySQL.

Lo que si puedo apreciar en tu diagrama es que todas las FK las tienes como nulables, lo que implica que no son datos obligatorios en tu esquema. eso está mal.

En cuanto al uso de MySQL Workbench, la interfaz gráfica permite crear modelados de datos, pero toma el motor por default como base para hacerlo, a menos que reconfigures las propiedades de la herramienta para eso.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Última edición por gnzsoloyo; 17/04/2014 a las 23:38
  #5 (permalink)  
Antiguo 17/04/2014, 23:39
 
Fecha de Ingreso: octubre-2008
Mensajes: 147
Antigüedad: 15 años, 6 meses
Puntos: 3
Respuesta: Problema al Relacionar Tablas MySQL

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Ese nivel de restricciones sólo opera si las tablas son InnoDB, y se declararon las FK al crearlas o se les agregó luego de crearlas. Pero si el motor de tablas de MySQL que tienes en tu servidor es MyISAM, y no InnoDB, las FK no existen, ya que las MyISAM no las soporta.
No te olvides que MySQL no tiene un único motor de tablas, a diferencia de otros DBMS.
Todo esto está en el maual de referencia on-line de MySQL.

Verifica cuál es el ENGINE de las tablas del diagrama, y verifica cuál es el de las tablas creadas.

En cuanto al uso de MySQL Workbench, la interfaz gráfica permite crear modelados de datos, pero toma el motor por default como base para hacerlo, a menos que reconfigures las propiedades de la herramienta para eso.
Según esto está configurado bien el modelo...

  #6 (permalink)  
Antiguo 17/04/2014, 23:46
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Problema al Relacionar Tablas MySQL

Cita:
en tu diagrama es que todas las FK las tienes como nulables, lo que implica que no son datos obligatorios en tu esquema. eso está mal.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #7 (permalink)  
Antiguo 17/04/2014, 23:53
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Problema al Relacionar Tablas MySQL

Para que se entienda la observación:
Cita:
Nota: InnoDB no verifica las restricciones de claves foráneas en las claves foráneas o valores de claves referenciados que contengan una columna NULL.
http://dev.mysql.com/doc/refman/5.0/...nstraints.html

Caso en tu base:
Código MySQL:
Ver original
  1. CREATE TABLE IF NOT EXISTS `SistemaTLM`.`OperadoresTLM` (
  2.   `ID_Operador` INT NOT NULL AUTO_INCREMENT,
  3.   `CURP_OP` VARCHAR(18) NULL,  -- < Esto no se valida
  4.   `Nombre_OP` INT NULL,
  5.   `APaterno_OP` VARCHAR(20) NULL,
  6.   `AMaterno_OP` VARCHAR(20) NULL,
  7.   `FNacimiento_OP` DATE NULL,
  8.   `Estatus_OP` INT NULL,
  9.   `FechaAlta_OP` DATE NULL,
  10.   `Licencia_OP` VARCHAR(255) NULL,
  11.   `Licencia_Vence_OP` DATE NULL,
  12.   `Unidad_OP` VARCHAR(15) NULL, -- < Estto no se valida
  13.   PRIMARY KEY (`ID_Operador`),
  14.   INDEX `fk_OperadoresTLM_DireccionOP1_idx` (`CURP_OP` ASC),
  15.   INDEX `fk_OperadoresTLM_UnidadesTLM1_idx` (`Unidad_OP` ASC),
  16.   CONSTRAINT `fk_OperadoresTLM_DireccionOP1`
  17.     FOREIGN KEY (`CURP_OP`)
  18.     REFERENCES `SistemaTLM`.`DireccionOP` (`CURP_OP`)
  19.   CONSTRAINT `fk_OperadoresTLM_UnidadesTLM1`
  20.     FOREIGN KEY (`Unidad_OP`)
  21.     REFERENCES `SistemaTLM`.`UnidadesTLM` (`Numero_UN`)
  22.  
  23.    # Esto no tiene sentido. ----------------------
  24.   CONSTRAINT `fk_OperadoresTLM_ValesTLM1`
  25.     FOREIGN KEY (`ID_Operador`)
  26.     REFERENCES `SistemaTLM`.`ValesTLM` (`Operador_V`)

Otro caso en tu base:
Código MySQL:
Ver original
  1. CREATE TABLE IF NOT EXISTS `SistemaTLM`.`PanelControlModulos` (
  2.   `ID_Modulo` INT NOT NULL AUTO_INCREMENT,
  3.   `NombreModulo` VARCHAR(255) NULL,
  4.   `ImagenModulo` VARCHAR(255) NULL,
  5.   `LinkModulo` VARCHAR(255) NULL,
  6.   `innerModulo` VARCHAR(255) NULL,
  7.   PRIMARY KEY (`ID_Modulo`),
  8.   CONSTRAINT `fk_PanelControlModulos_PanelControlSecciones`
  9.     FOREIGN KEY (`ID_Modulo`)
  10.     REFERENCES `SistemaTLM`.`PanelControlSecciones` (`ID_Modulo`)
¿La PK es AI, pero FK de otra tabla?
Eso no tiene sentido.
Si es un AI en una tabla no puede ser FK de otra tabla, Puede ser INT, pero es la tabla padre la que debe ser AI, no la local.

Tengo la impresión de que no tienes claro el tema de relaciones de foreign key...

Otra cosa: al apuntar a si mismas como FK, se disparan errores al correr tu backup, porque no puede crearse una FK sobre si misma cuando la tabla aún está creándose.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #8 (permalink)  
Antiguo 18/04/2014, 00:04
 
Fecha de Ingreso: octubre-2008
Mensajes: 147
Antigüedad: 15 años, 6 meses
Puntos: 3
Respuesta: Problema al Relacionar Tablas MySQL

Hola de nuevo, no sabía eso, ya he cambiado lo de los campos null, se pusieron en azul los campos, aunque unos en rojos, la imagen del diseño la subí y debería aparecer actualizada en el pos...
  #9 (permalink)  
Antiguo 18/04/2014, 00:11
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Problema al Relacionar Tablas MySQL

Sería mejor que primero usaras el recurso de Forward engineering y generaras el script de la base, y lo vuelvas a postear acá.
Así vemos si está mejor.

Ten en cuetna que todo dato que en tu sistema deba ser obligatorio para el usuario que ingresa los datos, debe ser declarado NOT NULL. Siempre.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #10 (permalink)  
Antiguo 18/04/2014, 00:12
 
Fecha de Ingreso: octubre-2008
Mensajes: 147
Antigüedad: 15 años, 6 meses
Puntos: 3
Respuesta: Problema al Relacionar Tablas MySQL

Cita:
Iniciado por gnzsoloyo Ver Mensaje

¿La PK es AI, pero FK de otra tabla?
Eso no tiene sentido.
Si es un AI en una tabla no puede ser FK de otra tabla, Puede ser INT, pero es la tabla padre la que debe ser AI, no la local.

Tengo la impresión de que no tienes claro el tema de relaciones de foreign key...

Otra cosa: al apuntar a si mismas como FK, se disparan errores al correr tu backup, porque no puede crearse una FK sobre si misma cuando la tabla aún está creándose.

Ciertamente no tengo claro las relaciones foreignkey, en la escuela nunca vimos el tema pero si nos dejaron el proyecto que requiere que lo sepamos.

Por eso me gustaría ver un ejemplo usando mis tablas para yo entender como debo hacerlo, porque en internet los ejemplos que veo usan tablas de ellos pero muchas veces no tienen casos de dependencias o restricciones que yo necesito ocupar...

en el Workbench yo solo le picaba al de relaciones y le daba click al campo padre y luego al hijo, y a veces no me dejaba y lo hacía al revez, la cosa es que no sé que onda :(

Pero no soy tonto, si me explican con un ejemplo de mis tablas lo entenderé, por eso acudí aquí y creeme que te agradezco los comentarios
  #11 (permalink)  
Antiguo 18/04/2014, 00:16
 
Fecha de Ingreso: octubre-2008
Mensajes: 147
Antigüedad: 15 años, 6 meses
Puntos: 3
Respuesta: Problema al Relacionar Tablas MySQL

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Sería mejor que primero usaras el recurso de Forward engineering y generaras el script de la base, y lo vuelvas a postear acá.
Así vemos si está mejor.

Ten en cuetna que todo dato que en tu sistema deba ser obligatorio para el usuario que ingresa los datos, debe ser declarado NOT NULL. Siempre.
Listo, ya subi al servidor el sql actualizado, es el mismo link:

SQL
Workbench
  #12 (permalink)  
Antiguo 18/04/2014, 11:46
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Problema al Relacionar Tablas MySQL

Sigues teniendo muchos problemas:
Código MySQL:
Ver original
  1. CREATE TABLE IF NOT EXISTS `SistemaTLM`.`PermisosSystemTLM` (
  2.   `ID_Permiso` INT NOT NULL AUTO_INCREMENT,
  3.   `Usuario_ID` INT NOT NULL,
  4.   `ID_SubMenu` INT NOT NULL,
  5.   PRIMARY KEY (`ID_Permiso`))
Usuario_ID y ID_SubMenu deberían ser FK de sus tablas origen.
Código MySQL:
Ver original
  1. CREATE TABLE IF NOT EXISTS `SistemaTLM`.`PanelControlSecciones` (
  2.   `ID_SubMenu` INT NOT NULL AUTO_INCREMENT,
  3.   `ID_Modulo` INT NOT NULL,
  4.   `NombreSeccion` VARCHAR(255) NULL,
  5.   `LinkSeccion` VARCHAR(255) NULL,
  6.   `ImagenSec` VARCHAR(255) NULL,
  7.   PRIMARY KEY (`ID_SubMenu`),
  8.   CONSTRAINT `fk_PanelControlSecciones_PermisosSystemTLM1`
  9.     FOREIGN KEY (`ID_SubMenu`)
  10.     REFERENCES `SistemaTLM`.`PermisosSystemTLM` (`ID_SubMenu`)
ID_Modulo debería ser FK de su tabla origen.
ID_SubMenu no puede ser FK si es una PK y autoincremental en esta tabla.
Código MySQL:
Ver original
  1. CREATE TABLE IF NOT EXISTS `SistemaTLM`.`PanelControlModulos` (
  2.   `ID_Modulo` INT NOT NULL AUTO_INCREMENT,
  3.   `NombreModulo` VARCHAR(255) NULL,
  4.   `ImagenModulo` VARCHAR(255) NULL,
  5.   `LinkModulo` VARCHAR(255) NULL,
  6.   `innerModulo` VARCHAR(255) NULL,
  7.   PRIMARY KEY (`ID_Modulo`),
  8.   CONSTRAINT `fk_PanelControlModulos_PanelControlSecciones`
  9.     FOREIGN KEY (`ID_Modulo`)
  10.     REFERENCES `SistemaTLM`.`PanelControlSecciones` (`ID_Modulo`)
ID_Modulo no puede ser FK de otra tabla porque es autoincremental en esta.

En el caso de estas dos últimas tablas, estás creando una relación circular: La PK de la primera es FK de la segunda, donde su PK es FK de la primera.
Eso es una relación de imposible cumplimiento.

Si sigo adelante encuentro etos mismos problemas todo el tiempo...

Vamos al principio fundamental:

1) Toda tabla es como mínimo, la representación de una entidad del sistema.
2) Ciertas tablas son desagregaciones de una entidad por razones de normalización (Ver Formas Normales).
3) Ciertas tablas son producto de relaciones N:M (muchos a muchos), que obligatoriamente determinan la existencia de la tabla.

Y luego:

4) Toda tabla debe tener una clave primaria (PK).
5) Una clave primaria puede estar compuesta de un campo único, o de más de un campo, en tanto el grupo definido como PK sea de valores únicos para cada registro, para atributos en el mismo orden.
6) Un a clave foránea (FK) es un campo o conjunto de campos que referencia a la clave primaria de otra tabla, expresando una relación con esa tabla.
7) Una FK sólo puede tener por valores los valores que existan previamente en la tabla referenciada (donde esa clave es PK).
8) Una FK puede ser nula, si y sólo si la relación es opcional, y no mandatoria.
9) No pueden existir dependencias circulares.
10) Si una tabla hereda su clave de otra como FK (es PK y FK al mismo tiempo en su tabla), en la tabla dependiente no puede ser autoincremental. Esto por dos razones a) sus valores no se originan localmente, sino en la tabla referida, y b) una FK usualmente expresa una relación 1:N, donde la FK podría aparecer repetida, combinada con un discriminante, lo que rompería con su secuencialidad numérica.
11) Otras, muchas otras cosas mas....

Para limpiar un poco todo eso sería menester posiblemente borrar todas las relaciones y crearlas de nuevo, verificando qué es lo que se representa y cuáles son las dependencias funcionales entre las entidades.

La verdad es que sin conocer qué es lo que se trabaja, es un poco difícil.
¿Podrías describir sucintamente el sistema que estás modelando? ¿Qué hace, y qué entidades tiene?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Etiquetas: php, relacionar, sql, tabla, tablas
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 12:40.