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.