sql >> Base de Datos >  >> RDS >> Mysql

¿Puede una clave externa actuar como clave principal?

Por supuesto. Esta es una técnica común conocida como supertyping mesas. Como en su ejemplo, la idea es que una tabla contenga un superconjunto de entidades y tenga atributos comunes que describan una entidad general, y otras tablas contengan subconjuntos de esas entidades con atributos específicos. No es diferente a una jerarquía de clases simple en el diseño orientado a objetos.

Para su segunda pregunta, una tabla puede tener dos columnas que son claves externas separadas para la misma otra tabla. Cuando la base de datos genera la consulta, se une a esa otra tabla dos veces. Para ilustrar en una consulta SQL (no estoy seguro acerca de la sintaxis de MySQL, no la he usado en mucho tiempo, por lo que esta es específicamente la sintaxis de MS SQL), le daría a esa tabla dos alias distintos al seleccionar datos. Algo como esto:

SELECT
    student_accounts.name AS student_name,
    counselor_accounts.name AS counselor_name
FROM
    student_rec
    INNER JOIN user_accounts AS student_accounts
      ON student_rec.student_number = student_accounts.user_id
    INNER JOIN user_accounts AS counselor_accounts
      ON student_rec.guidance_counselor_id = counselor_accounts.user_id

Esto esencialmente toma el student_rec y la combina con user_accounts tabla dos veces, una en cada columna, y asigna dos alias diferentes al combinarlos para diferenciarlos.