Cita:
lbuelvas:
La ventaja es que las consultas pueden ser en la mayoria de las ocasiones mucho mas efcientes porque esos indices los utiliza el motor para elabora el plan que debe seguir para recuperar información de la base de datos.
Sin llaves foraneas se incrementa la complejidad del aplicativo porque tendrian que ponerse esos controles del lado del software que estes desarrollando para mantener la integridad de la información y además el aplicativo iria mas lento porque al verificar la existencia de un registro en una tabla con el valor que pretendes insertar en otra, la base de datos tendría que hacer un recorrido sobre toda la tabla hasta encontrar dicho valor, si esta tabla es de cientos de miles de registros sería catastrófico.
|
Estoy totalmente de acuerdo, opino que estas serian la razones mas importante de apoyarse siempre de todas las llaves foraneas necesarias al momento de diseñar nuestra base de datos.
Cita:
Delphius:
Me atrevería a apostar que pretender meter claves foráneas en todos lados es motivo de un mal diseño o de una mala comprensión de los conceptos de la teoría de base de datos... con todo respeto.
|
La verdad es que no me imagino como se pueden crear llaves foraneas que no se necesiten o que no cumpliran con ningun objetivo, pero veamos un caso hipotetico practico simple:
[transaccionesEncabezado]
EncabezadoId
EncabezadoFecha
clienteId
vendedorId
usuarioId
sucursalId
[transaccionesDetalle]
EncabezadoId
productoId
unidadId
productoCantidad
productoPrecio
Caso 1:
relacion foranea1: tablas transaccionesEncabezado y transaccionesDetalle con EncabezadoId (maestro / detalle de las transacciones)
... fin de las relaciones
Caso 2:
relacion foranea1: tablas transaccionesEncabezado y transaccionesDetalle con EncabezadoId (maestro / detalle de las transacciones)
relacion foranea2: tablas transaccionesEncabezado y clientes con clienteId
relacion foranea3: tablas transaccionesEncabezado y vendedores con vendedorId
relacion foranea4: tablas transaccionesEncabezado y usuarios con usuarioId
relacion foranea5: tablas transaccionesEncabezado y sucursales con sucursalId
relacion foranea6: tablas transaccionesDetalle y productos con productoId
relacion foranea7: tablas transaccionesDetalle y unidades con unidadId
... fin de las relaciones
Aunque sean mas, la verdad es que siento que puedo dormir mas tranquilo con el segundo caso
Con lo que me referia al tema inicial es por qué dejar intencionalmente una relacion como el caso 1? ¿a cambio de que sacrificar la integridad de la informacion?... sera mejor performance de la db? velocidad? menos corrupcion? otras tecnicas de mantener la integridad? algo que desconozco? o simplemente es un mal diseño de la base de datos y me estoy complicando mas de la cuenta... todo viene por lo que señale al principio del post:
Cita:
|
Me surgio la duda cuando estaba observando dias atras el diseño de una base de datos (obviamente en firebird) de un producto muy terminado y con muchos años en el mercando y observe que utiliza muy poco las llaves foraneas, solo en caso excepcionales como en tablas de maestro / detalle de transacciones (Caso 1), despues nada de llaves foraneas.
|