Cela dépend
Il existe de nombreuses discussions existantes sur les compromis entre clés naturelles et clés de substitution - vous devrez décider de ce qui fonctionne pour vous et de la "norme" au sein de votre organisation.
Dans le cas de l'OP, il existe à la fois une clé de substitution (int userId
) et une clé naturelle (char
ou varchar username
). L'une ou l'autre colonne peut être utilisée comme clé primaire pour la table, et dans tous les cas, vous pourrez toujours imposer l'unicité de l'autre clé.
Voici quelques considérations lors du choix d'une manière ou d'une autre :
Le cas de l'utilisation de clés de substitution (par exemple, UserId INT AUTO_INCREMENT)
Si vous utilisez un substitut, (par exemple UserId INT AUTO_INCREMENT
) comme clé primaire, puis toutes les tables référençant la table MyUsers
doit alors utiliser UserId
comme clé étrangère.
Vous pouvez cependant toujours imposer l'unicité du username
colonne grâce à l'utilisation d'un index unique
supplémentaire , par exemple :
CREATE TABLE `MyUsers` (
`userId` int NOT NULL AUTO_INCREMENT,
`username` varchar(100) NOT NULL,
... other columns
PRIMARY KEY(`userId`),
UNIQUE KEY UQ_UserName (`username`)
Selon @Dagon, en utilisant une clé primaire étroite (comme un int
) présente des avantages en termes de performances et de stockage par rapport à l'utilisation d'une valeur plus large (et de longueur variable) telle que varchar
. Cet avantage a également un impact sur d'autres tables qui référencent MyUsers
, comme clé étrangère de userid
sera plus étroit (moins d'octets à récupérer).
Un autre avantage de la clé entière de substitution est que le nom d'utilisateur peut être modifié facilement sans affecter les tables faisant référence à MyUsers
.Si le username
a été utilisé comme clé naturelle, et d'autres tables sont couplées à MyUsers
via username
, il est très peu pratique de changer un nom d'utilisateur (puisque la relation de clé étrangère serait autrement violée). Si la mise à jour des noms d'utilisateur était requise sur les tables utilisant username
comme clé étrangère, une technique comme ON UPDATE CASCADE
est nécessaire pour préserver l'intégrité des données.
Le cas de l'utilisation de clés naturelles (c'est-à-dire le nom d'utilisateur)
L'un des inconvénients de l'utilisation des clés de substitution est que d'autres tables faisant référence à MyUsers
via une clé de substitution devra être JOIN
renvoyé à MyUsers
table si le Username
colonne est obligatoire. L'un des avantages potentiels des clés naturelles est que si une requête ne nécessite que le Username
colonne d'une table faisant référence à MyUsers
, qu'il n'a pas besoin de rejoindre MyUsers
pour récupérer le nom d'utilisateur, ce qui économisera une surcharge d'E/S.