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

[SOLUCIONADO] Foreign Keys

Estas en el tema de Foreign Keys en el foro de Mysql en Foros del Web. Hola. Tengo una duda relativa a las claves foráneas. Tengo las siguientes tablas. Para no delegar la integridad en la aplicación, decidí añadir claves foráneas ...
  #1 (permalink)  
Antiguo 20/09/2016, 16:04
 
Fecha de Ingreso: marzo-2010
Ubicación: Buenos Aires
Mensajes: 59
Antigüedad: 14 años
Puntos: 2
Foreign Keys

Hola. Tengo una duda relativa a las claves foráneas.

Tengo las siguientes tablas. Para no delegar la integridad en la aplicación, decidí añadir claves foráneas pero no termino de comprender el funcionamiento. Dejo las tres tablas que quisiera conectar:

Código SQL:
Ver original
  1. CREATE TABLE usuarios (
  2.   id INT NOT NULL AUTO_INCREMENT,
  3.   nombre VARCHAR(50) NOT NULL,
  4.   apellido VARCHAR(50) NOT NULL,
  5.   activo tinyint(1) NOT NULL DEFAULT 0,
  6.   dni VARCHAR(10),
  7.   observaciones longtext,
  8.   INDEX (id),
  9.   PRIMARY KEY (id)) engine=InnoDB;
  10.  
  11. CREATE TABLE usuarios_aux_nivel_acceso (
  12.   id INT NOT NULL AUTO_INCREMENT,
  13.   id_usuario INT NOT NULL,
  14.   id_nivel_acceso INT NOT NULL,
  15.   INDEX (id),
  16.   INDEX (id_usuario),
  17.   INDEX (id_nivel_acceso),
  18.   PRIMARY KEY (id)) engine=InnoDB;
  19.  
  20. CREATE TABLE aux_nivel_acceso (
  21.   id INT NOT NULL AUTO_INCREMENT,
  22.   nivel INT NOT NULL,
  23.   nombre VARCHAR(30) NOT NULL,
  24.   descripcion longtext NOT NULL,
  25.   INDEX (id),
  26.   PRIMARY KEY (id)) engine=InnoDB;
  27.  
  28. ALTER TABLE usuarios_aux_nivel_acceso ADD CONSTRAINT fk_nivel_acceso_nivel FOREIGN KEY (id_nivel_acceso) REFERENCES aux_nivel_acceso(id);
  29. ALTER TABLE usuarios_aux_nivel_acceso ADD CONSTRAINT fk_nivel_acceso_usuario FOREIGN KEY (id_usuario) REFERENCES usuarios(id);
[/CODE]


Gracias!

Última edición por gnzsoloyo; 21/09/2016 a las 14:56
  #2 (permalink)  
Antiguo 20/09/2016, 17:08
 
Fecha de Ingreso: marzo-2010
Ubicación: Buenos Aires
Mensajes: 59
Antigüedad: 14 años
Puntos: 2
Respuesta: Foreign Keys

Ya lo comprendí. Nada como la prueba-error.

Ahora mi pregunta es: ¿es correcto mi código? ¿están bien ubicadas las fk?

En las pruebas que he realizado, mientras haya alguna referencia entre los registros, no se pueden eliminar. Pero no sé si sería correcto o más eficiente ponerlas en otra tabla.

Gracias!
  #3 (permalink)  
Antiguo 21/09/2016, 14:55
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: Foreign Keys

Cita:
En las pruebas que he realizado, mientras haya alguna referencia entre los registros
Precisamente eso es lo que se denomina "integridad referencial" y es el objetivo PRIMARIO de las FK. Evitar que puedas borrar, insertar o alterar algo sin respetar su dependencia.
Ponerlas en otra tabla NO ES EFICINENCIA, y por otro lado no afectará en nada, porque en esa tabla deberías definirlas como FK, con lo que vuelves a caer en la restricción.

No intentes inventar soluciones. Simplemente aprende a usar las FK según las reglas ya definidas, que son las que valen.

En cuanto a lo de bien puestas, es relativo. Si me atengo al modelo E-R, los ID son innecedsarios si ya tienes otros identificadores únicos, como son la columna NIVEL, que se supone que identifica a cada uno de los diferentes niveles.

Por otro lado, tu modelo de tres tablas sólo se justifica si un usuario dado puede tener N niveles de acceso diferentes, lo que sería irregular por decirlo suavemente. Diferentes niveles de acceso se suelen regular de otra forma.
Si un usuario solo tiene un único nivel, entonces la tabla usuarios_aux_nivel_acceso es superflua, y la FK del nivel debería estar en la tabla de usuario.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #4 (permalink)  
Antiguo 25/09/2016, 21:18
 
Fecha de Ingreso: marzo-2010
Ubicación: Buenos Aires
Mensajes: 59
Antigüedad: 14 años
Puntos: 2
Respuesta: Foreign Keys

Gracias por la explicación!

Etiquetas: claves, keys, tabla
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 03:57.