Mysql
 sql >> Database >  >> RDS >> Mysql

String o int è preferito per le chiavi esterne?

Dipende

Ci sono molte discussioni esistenti sui compromessi tra chiavi naturali e surrogate - dovrai decidere cosa funziona per te e qual è lo "standard" all'interno della tua organizzazione.

Nel caso dell'OP, esiste sia una chiave surrogata (int userId ) e una chiave naturale (char o varchar username ). Entrambe le colonne possono essere utilizzate come chiave primaria per la tabella e, in ogni caso, sarai comunque in grado di imporre l'univocità dell'altra chiave.

Ecco alcune considerazioni sulla scelta di un modo o dell'altro:

Il caso per l'utilizzo di chiavi surrogate (ad es. UserId INT AUTO_INCREMENT)

Se utilizzi un surrogato, (ad es. UserId INT AUTO_INCREMENT ) come chiave primaria, quindi tutte le tabelle fanno riferimento alla tabella MyUsers dovrebbe quindi utilizzare UserId come chiave esterna.

Puoi comunque imporre l'univocità del username colonna tramite l'uso di un ulteriore indice univoco , ad esempio:

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

Come per @Dagon, usando una chiave primaria stretta (come un int ) offre vantaggi in termini di prestazioni e archiviazione rispetto all'utilizzo di un valore più ampio (e di lunghezza variabile) come varchar . Questo vantaggio influisce anche su altre tabelle che fanno riferimento a MyUsers , come chiave esterna per userid sarà più stretto (meno byte da recuperare).

Un altro vantaggio della chiave intera surrogata è che il nome utente può essere modificato facilmente senza influire sulle tabelle che fanno riferimento a MyUsers .Se il username è stata utilizzata come chiave naturale e altre tabelle sono accoppiate a MyUsers tramite username , rende molto scomodo modificare un nome utente (poiché la relazione della chiave esterna verrebbe altrimenti violata). Se è stato richiesto l'aggiornamento dei nomi utente sulle tabelle utilizzando username come chiave esterna, una tecnica come ON UPDATE CASCADE è necessario per mantenere l'integrità dei dati.

Il caso dell'utilizzo di chiavi naturali (ovvero nome utente)

Uno svantaggio dell'utilizzo delle chiavi surrogate è che altre tabelle fanno riferimento a MyUsers tramite una chiave surrogata dovrà essere JOIN ed è tornato a MyUsers tabella se il Username la colonna è obbligatoria. Uno dei potenziali vantaggi delle chiavi naturali è che se una query richiede solo il Username colonna da una tabella che fa riferimento a MyUsers , che non è necessario che si unisca nuovamente a MyUsers per recuperare il nome utente, che salverà un po' di sovraccarico di I/O.