27

Tengo la tabla 1 con una clave principal user_id y la tabla 2 donde user_id es una clave externa.MySQL - Usar clave externa como clave principal también

Solo puede haber 1 registro por user_id en la tabla 2, y no puede existir ningún registro sin él.

PREGUNTA: ¿Puede user_id en la tabla 2 ser clave externa y principal al mismo tiempo, y si es así, es una buena idea, ¿cuáles son los pros/contras?

+0

Pregunta similar (pero no duplicada): [¿Cómo crear una clave externa que también es una clave principal en MySQL?] (Http://stackoverflow.com/questions/5575051/how-to-create-foreign-key -that-is-also-a-primary-key-in-mysql) – naXa

Respuesta

32

Sí, puede hacerlo (y debe hacerlo, desde el punto de vista del diseño de la base de datos).

Sin embargo, considere qué significa si user_id es la clave principal en la tabla 2. En efecto, dice que cada fila en la tabla 2 corresponde a un usuario, pero ya tiene una tabla donde cada fila corresponde a un usuario: tabla 1. Esto plantea la pregunta "¿por qué no pone todos los datos de la tabla 2 en columnas que aceptan nulos en la tabla 1?". Después de todo, tener dos tablas significa que tendrá que hacer dos consultas para obtener estos datos en lugar de uno.

Ahora hay algunos escenarios en los que esta práctica podría ser una buena idea:

  • si usted tiene una gran cantidad de usuarios, pero sólo unas pocas filas de la tabla 2, tal vez la consulta en la tabla 2 será solamente realiza raramente ; al mismo tiempo, puede ganar espacio de almacenamiento y velocidad de modificación en la tabla 1
  • ; podría ser posible en el futuro cambiar la clave primaria de la tabla 2, mientras la clave externa permanezca; si coloca todos los datos en la tabla 1, es probable que esta modificación rompa su modelo de base de datos

Puede ser una buena idea, pero depende de los detalles de su aplicación.

+2

Gracias. En mi caso, es el primer escenario que mencionas, más el hecho de que la tabla 2 tiene muchas columnas, y también hay tablas 3, 4, etc. que están en relación similar a la tabla 1, por lo que poner todas las columnas sería demasiado. – CodeVirtuoso

+5

Una situación en la que esto tiene sentido es si está utilizando [class table inheritance] (http://stackoverflow.com/a/3579462/1709587) y la tabla 2 representa una subclase de la tabla 1. Creo que esto es un especial caso de su primer punto de viñeta. –

+0

Otra razón para hacerlo sería si tiene dos tablas diferentes, la Tabla A y la Tabla B, que comparten columnas en la Tabla C. Por ejemplo, tiene una Tabla llamada Contactos, otra llamada Empleados y otra llamada Personas. La gente tiene firstname, lastname, etc. y los contactos y empleados representan a personas. –

Cuestiones relacionadas