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

¿Se prefiere string o int para claves foráneas?

Depende

Hay muchas discusiones existentes sobre las compensaciones entre Claves naturales y sustitutas - tendrá que decidir qué funciona para usted y cuál es el "estándar" dentro de su organización.

En el caso del OP, hay una clave sustituta (int userId ) y una clave natural (char o varchar username ). Cualquiera de las columnas se puede usar como clave principal para la tabla y, de cualquier manera, aún podrá imponer la unicidad de la otra clave.

Aquí hay algunas consideraciones al elegir una forma u otra:

El caso del uso de claves sustitutas (por ejemplo, UserId INT AUTO_INCREMENT)

Si usa un sustituto, (por ejemplo, UserId INT AUTO_INCREMENT ) como clave principal, luego todas las tablas que hacen referencia a la tabla MyUsers entonces debería usar UserId como clave externa.

Sin embargo, aún puede imponer la unicidad del username columna mediante el uso de un índice único adicional , por ejemplo:

CREATE TABLE `MyUsers` (
  `userId` int NOT NULL AUTO_INCREMENT,
  `username` varchar(100) NOT NULL,
  ... other columns
  PRIMARY KEY(`userId`),
  UNIQUE KEY UQ_UserName (`username`)

Según @Dagon, usando una clave primaria estrecha (como un int ) tiene beneficios de rendimiento y almacenamiento en comparación con el uso de un valor más amplio (y de longitud variable) como varchar . Este beneficio también afecta a otras tablas que hacen referencia a MyUsers , como clave externa para userid será más estrecho (menos bytes para recuperar).

Otro beneficio de la clave de entero sustituto es que el nombre de usuario se puede cambiar fácilmente sin afectar las tablas que hacen referencia a MyUsers .Si el username se usó como clave natural, y otras tablas están acopladas a MyUsers a través de username , hace que sea muy inconveniente cambiar un nombre de usuario (ya que de lo contrario se violaría la relación de clave externa). Si se requería actualizar los nombres de usuario en las tablas usando username como clave externa, una técnica como ON UPDATE CASCADE es necesario para conservar la integridad de los datos.

El caso del uso de claves naturales (es decir, nombre de usuario)

Una desventaja de usar Surrogate Keys es que otras tablas que hacen referencia a MyUsers a través de una clave sustituta deberá ser JOIN volvió a MyUsers tabla si el Username la columna es obligatoria. Uno de los beneficios potenciales de las claves naturales es que si una consulta requiere solo el Username columna de una tabla que hace referencia a MyUsers , que no necesita volver a unirse a MyUsers para recuperar el nombre de usuario, lo que ahorrará algunos gastos generales de E/S.