Ver Mensaje Individual
  #18 (permalink)  
Antiguo 29/04/2011, 13:52
Avatar de gnzsoloyo
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, 5 meses
Puntos: 2658
Respuesta: Duda con truncate.

Vamos entonces aun poco de teoría:
Cuando tienes dos tablas que se relacionan entre si con cardinalidad N:N, significa que cada registro de la tabla A puede relacionarse con cero o más registros de la B, y que además cada registro de la B puede estar en más de uno de la A. Eso es una relación N:N, y por definición del modelo, requiere una tabla independiente en donde ambas PK se relacionen una vez por cada par vinculado.
El tema es que la relación única ya está dada por las dos PK que se ponen en esa tabla. Con declararlas ambas como PK al mismo tiempo, ya defines que no se puede repetir un vínculo jamás.
SI y sólo si un par puede repetirse por alguna razón, entonces debe ponersele una PK propia a esa tabla. Nada más.
Es el caso, por ejemplo, de turnos médicos: Un mismo médico puede tener consultas con el mismo paciente más de una vez, pero no en la misma fecha, por lo que la fecha es parte de la PK. ¿se entiende?
Es un ejemplo simple, pero por allí anda la cosa.

Lo de los excesos de FK se producen especialmente cuando tienes poca experiencia en bases de datos. Es muy habitual que el diseñador quiera "asegurarse" de tener todos los datos disponibles, y termina colocando FK donde no se necesitan, porque las relaciones están ya implícitas.
Si la tabla B depende de la A, y la C de la B, no necesito poner la FK de A en C. Esa relación es transitiva y por tanto si lo hago le estoy metiendo una redundancia de datos absolutamente innecesaria.
Imaginemos el detalle de una Factura. Tiene los ID de los productos, y las cantidades vendidas; pero no necesita tener además el ID del proveedor del producto, ya que eso lo puedo sacar directamente del código de producto vendido. ¿Se entiende?
El problema de excederse en meter las FK en tablas que no lo necesitan es que cuando haces un borrado, las FK generan restricciones que impiden algunos de ellos. Pueden darse dependencias ciculares.
Supongamos que D tiene la FK de A, pero B también, C tiene la de B y D tiene la de C. ¿Cuál tabla puedes borrar?
Respuesta: Ninguna. Se ha formado un circulo de dependencias.
Cuando empiezas a crear tablas y poner las FK puede suceder que al querer conectar todo con todo, sin saberlo estás creando una cadena circular como esa (tres, cuatro o más tablas en secuencia que dependen unas de otras).
Habría que revisar con cuidado y ver si no se está produciendo eso allí.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)