2010-06-01 15 views
26

¿Es mejor utilizar claves foráneas en tablas o se pueden obtener los mismos resultados con combinaciones?Llaves foráneas vs Uniones

+3

¿Cuál es la diferencia? Las uniones se definen solo con claves externas. Por supuesto, es posible que no defina la clave externa en la base de datos. El uso de una clave externa mejorará el rendimiento (siempre que la selección de la clave externa sea la correcta). – Kangkan

+2

'Las uniones se definen con claves externas solamente' ¡Falso! 'Usar clave externa mejorará el rendimiento 'También es falso. De hecho, en todo caso, los FK pueden dañar el rendimiento, aunque solo en raras ocasiones hasta un grado notable que justifique eliminarlos. – Brandon

+1

@Kangkan crear FK no tiene nada que ver con el rendimiento FK! = Índices. Hay DBMS automático crea un índice en la creación FK, pero la mayoría no lo hace. Las uniones no necesitan FK, consulte la excelente respuesta de Daniel. Tal vez OP se confunde con los marcos ORM – jean

Respuesta

53

Foreign keys son solo restricciones para aplicar referential integrity. Aún necesitará usar JOINs para generar sus consultas.

Las claves externas garantizar que una fila de una tabla con un campo order_detailsorder_id referencia a una tabla orders nunca va a tener un valor order_id que no existe en la tabla orders. No es necesario que las claves foráneas tengan una base de datos relacional activa (de hecho, el motor MySQL's default storage no admite FK), pero definitivamente son esenciales para evitar relaciones rotas y filas huérfanas (es decir, integridad referencial).

+1

Solo quiero señalar que, aunque FK es genial, es un diseño bastante pobre * confiar * en el DB para la lógica de la aplicación. Su aplicación puede interrumpirse sin actualizaciones en su base de datos (multiplique por instalaciones). Puede también minimizarlo. –

+6

@sims: No considero "integridad referencial" como lógica de aplicación. La capacidad de aplicar la integridad referencial en el nivel de la base de datos es necesaria para que la C en [ACID] ​​(http://en.wikipedia.org/wiki/ACID) esté en pie. –

+0

@sims: Estoy de acuerdo con Daniel, pero me gustaría extender su razonamiento. IMO RI es parte de la lógica comercial (o 'lógica de datos') que debe aplicarse en algún lugar (UNA VEZ, no se repita). Dado que el DB es la autoridad de datos central/final, los datos deben ser válidos allí, por lo tanto, su punto de invocación de ACID es correcto. – lexu

22

FOREIGN KEY s y JOIN s no hacen lo mismo!

  • A FOREIGN KEY exige la integridad de datos, asegurándose de que el dato confirma que algunas reglas cuando se añade a la DB.
  • A JOIN se usa cuando extrae/consulta datos del DB dando reglas de cómo seleccionar los datos.

  • JOIN s funcionan si hay FK o no.

  • FK funciona si se extraen datos con o sin JOIN s.

CONCLUSIÓN: FK y JOIN no le permiten lograr el mismo objetivo!