Mysql
 sql >> Base de données >  >> RDS >> Mysql

Est-ce que string ou int est préféré pour les clés étrangères ?

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.