2010-07-20 14 views
13

Si tengo una relación entre dos tablas (ambas tablas tienen sus propias claves principales) ¿qué debería guiar mi decisión sobre qué tabla debe almacenar la clave externa? Entiendo que la naturaleza de la relación probablemente sea importante (uno a uno, uno a muchos, muchos a muchos, unidireccional, bidireccional), y probablemente también sean importantes los patrones de acceso. Sin embargo, ¿qué es una forma sistemática de tomar esa decisión?¿Dónde debo almacenar una clave externa?

+2

"¿Qué es una forma sistemática de tomar esa decisión?" "entiendo que la naturaleza de la relación probablemente importe". Correcto. La naturaleza de la relación importa. No entiendo la pregunta ¿Desea saber cómo definir cuál depende del otro? –

+0

La [documentación de MySQL de claves externas] (https://dev.mysql.com/doc/refman/5.5/en/create-table-foreign-keys.html#idm139680617903472) proporciona un ejemplo simple de la relación entre 2 padres tablas: 'cliente',' producto' y una tabla secundaria: 'product_order'. En ese ejemplo, 'product_order' es la tabla secundaria que debe contener las claves externas. –

Respuesta

18

¿Qué tabla es el niño en la relación?
Responde eso, y sabes qué tabla necesita la columna de clave externa, haciendo referencia a la clave principal [típica] del padre. Eso es para una relación de uno a muchos ...

Un número de muchos requeriría que agregue una tercera tabla, usando las claves de ambas tablas como su clave principal.

+3

... y si no hay una relación niño/padre. es probable que sea de muchos a muchos en una tabla de unión. – Wrikken

+5

O es una relación uno-a-uno y OP debería preguntarse por qué se divide en dos tablas en primer lugar. – Allan

+1

@Wrikken, @Allan: puntos excelentes, ambos. –

1

Una clave foránea es simplemente un campo en una tabla que hace referencia a un campo clave de otra tabla. No es absolutamente crítico identificar el campo de la clave externa como tal. Es decir, no es necesario agregar explícitamente la restricción FOREIGN KEY ... REFERENCES a la tabla para que sea una clave externa. Cuando une las dos tablas, la clave principal de la tabla principal se establecerá igual a la clave externa de la tabla secundaria. Cualquiera que sea no, la clave principal es la clave externa.

En relaciones uno a muchos, el FK va en el lado "muchos". No puede ir del lado "uno" porque es allí donde va la PK y la definición de una clave principal incluye rechazar duplicados.

Si tiene una relación de varios a varios, deberá volver a trabajar las tablas para que termine con dos relaciones uno a muchos y una tabla de resolución intermedia.

7

"¿Qué es una forma sistemática de tomar esa decisión?"

Parece haber dos opciones: el lado "Uno" como FK del lado "Muchos lados", o el lado "Muchos" tiene FK al lado "Uno".

Busquemos realmente las opciones.

  • Todas las filas de los "muchos" lado pueden hacer referencia fácilmente una fila en el lado "uno".

  • La fila uno en el lado "Uno" no puede hacer referencia a TODAS las filas en el lado "Muchos".

Solo funciona una técnica: "Muchos" lado tiene FK a "Uno" lado.

Solo hay una opción de implementación real. No hay "decisión".

+3

En resumen: es una cuestión de cardinalidad. Si tiene una relación de muchos a uno, la clave debe residir en el lado 'muchos'. Si es one-to-maybe-one, en el lado 'uno'. Si es many-to-many, necesita una tabla intermedia. Si es uno a uno, puede elegir libremente. – reinierpost

0

Como un primary key, un foreign key es también un tipo de constraint colocado en una o más columnas en una tabla.

El foreign key establece un enlace entre las columnas clave y las columnas relacionadas en otra tabla. (También puede vincular las columnas de clave externa a las columnas dentro de la misma tabla.)

La tabla que contiene la clave externa se considera la tabla secundaria y la tabla a la que hace referencia la clave externa es la tabla principal.

Puntos clave

  1. El foreign key debe hacer referencia a una clave principal o restricción única, a pesar de que la referencia puede estar en la misma mesa o en una tabla diferente
  2. Un foreign key también deben tener la misma número de columnas como el número de columnas en la restricción a la que se hace referencia, y los tipos de datos deben coincidir entre las columnas correspondientes.
  3. A diferencia de Primary key, Foreign key las columnas pueden contener NULL values.
Cuestiones relacionadas