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

Duda al referenciar tablas

Estas en el tema de Duda al referenciar tablas en el foro de Bases de Datos General en Foros del Web. Buenas, tengo una duda que nunca me habia planteado despues de mucho tiempo con el SQL y el PHP. Voy a poner ejemplos simples para ...
  #1 (permalink)  
Antiguo 19/12/2009, 21:37
 
Fecha de Ingreso: diciembre-2008
Mensajes: 4
Antigüedad: 16 años
Puntos: 1
Duda al referenciar tablas

Buenas, tengo una duda que nunca me habia planteado despues de mucho tiempo con el SQL y el PHP.
Voy a poner ejemplos simples para que os situeis en mi duda.

Resulta que hasta ahora si tenia una tabla para almacenar discos y otra de autores y queria sacar el listado de discos con sus autores hacia una consulta del tipo:

SELECT loquesea FROM discos LEFT JOIN autores ON discos.idautor=autores.id
o
SELECT loquesea FROM discos, autores WHERE autores.idautor=autores.id

Lo que fuera segun la necesidad.

Es decir que la relacion la hacia a traves de la misma consulta sql.

Pero ahora me encuentro con una cosa llamada: Restricciones FOREIGN KEY ,que al parecer se deberían hacer siempre y no se como lo omití y que dice algo como:

ALTER TABLE `discos`
ADD CONSTRAINT `loquesea` FOREIGN KEY (`idautor`) REFERENCES `autores` (`ID`) ON DELETE CASCADE ON UPDATE CASCADE;

¿QUe signfica esta consulta exactamente? por otro lado...¿Una relacion quita la otra? no lo creo pero por si acaso. ¿Que quiere decir referenciar las tablas? Quiere decir que irá más rapido cuando se hagá la consulta? está mas optimizada?

¿son como los indices internos de la tabla pero para tablas externas? Por que de ser asi supongo que la explicación a una de las preguntas es para que valla más rapido. De ser asi ¿Es recomendable su uso? o es una tonteria de la que casi no hay que preocuparse??

¿en phpmyadmin como se haria de forma grafica? solo por curiosidad por que no lo veo, ni en la creacion de indices.

Vamos, supongo que no haberlo usado antes no será un delito en optimización pero si es recomendable me gustaria saber la mayor info que pueda sobre ello y hacerlo de forma correcta a partir de ahora.


Otra duda que tengo (Sigo con el ejemplo de los discos y los autores pero ahora con una tabla mas de usuarios y favoritos) es cuando quieres saber los discos favoritos de un usuario. Yo normalmente usaba una tabla que relacionase los discos con el usuario.

Es decir tenemos la tabla discos, usuarios y favoritos.
la tabla favoritos solo tiene los campos ID_USUARIO y ID_DISCO con INT los dos

Si por ejemplo queria saber los discos favoritos del usuario PEPE hacia algo del tipo:

SELECT discos.nombre FROM discos,favoritos,usuarios WHERE usuarios.NOMBRE='PEPE' AND usuarios.ID=favoritos.ID_USUARIO AND favoritos.ID_DISCO=discos.ID

He puesto algo rapido pero supongo que os haceis a la idea. Entonces mi duda es: como se hace para usar la forma de relacionar que comento arriba en este ejemplo?? tendria que hacerlo en la tabla favoritos diciendole que el ID_USUARIO es el ID de usuarios y lo mismo con discos?? ¿No se utiliza en estos casos?

Bueno creo que hay demasiadas preguntas así que paro y a ver si alguien pudiese aclararme las dudas o almenos alguna.

Un saludo!!
  #2 (permalink)  
Antiguo 19/12/2009, 21:57
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años, 1 mes
Puntos: 2658
Respuesta: Duda al referenciar tablas

Vamos por partes:
1. Una FOREIGN KEY es una parte del modelo relaciona y se trata de un nivel de restricciones: Restricción de dominio de campo.
2. Una FK es una clave foránea, ajena o externa. Esto significa que es un campo de una tabla que debe llevar un valor que se corresponda con la PRIMARY KEY de otra tabla, a la que se hace referencia.
3. La sentencia en cuestión lo que hace es establecer una relación en la base de datos entre ambas tablas, indicando al DBMS cuáles campos y cuales tablas están relacionadas, de qué forma y con qué condiciones.
4. Para que se pueda usar una FK, el motor de tablas del DBMS debe ser capaz de interpretar esa relación. En el caso de MySQL, el tipo de tablas MyISAM no soporta relaciones de FK, por lo que la sentencia no causa efectos. Sí son soportadas por el motor InnoDB.
5. Una FK determina, en esencia, que para que un registro pueda ser ingresado en una tabla, el valor del campo designado como FK debe existir previamente en la tabla referida.
6. El objetivo central de una FK es mantener la consistencia de datos, que en tu base debe ser mantenida a través de programación, ya que ni siquiera conocías lo que eran las FK...
7. En el caso de tus consultas, no se verían afectadas, aunque sí permitirían mayor seguridad a la hora de obtener datos, ya que tal y como planteaste el modelo, sería factible poner un disco como creado por diferentes autores... lo que se denomina inconsistencia de datos.
8. Toda tabla que contenga claves de otras tablas (como la de favoritos, que mencionas), debe tener las definiciones de FK correspondiente, para poder administrar correctamente las inserciones.

¿Se va comprendiendo un poco la idea?

Mi sugerencia es que vuelvas a revisar el tema de base relacional de datos, ya que si no conocías el tema, pueden también faltarte otros detalles. Sin ofender...
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
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

SíEste tema le ha gustado a 2 personas




La zona horaria es GMT -6. Ahora son las 00:41.