Va bene usare una colonna non ID per riferimento a chiave esterna?

5

Ho le mie tabelle come sotto

Role(Role ID, Name, Other_Columns)
Command(Command ID, Name, Other_Columns)

Ho una tabella delle associazioni RoleCommand. Va bene avere RoleCommand(RoleName, CommandName) anziché RoleCommand(Role ID, Command ID) . Mi sembra che sia più facile leggere o popolare la tabella di associazione in questo caso se i nomi sono usati come riferimento. Si noti che RoleCommand viene compilato manualmente con le query di inserimento. Non c'è interfaccia utente Web. Installerò vincoli di chiave univoci e riferimenti a chiave esterna su Name colonne. Qualcuno usa questo tipo di referenze in produzione? La maggior parte delle volte vedo solo gli ID utilizzati per le tabelle di associazione.

UPDATE:

Sto prendendo in considerazione l'utilizzo di name per i riferimenti a chiavi esterne perché le query di inserimento per RoleCommand sono così brutte con% nidificato% query di co_de all'interno di SELECT per ottenere i valori ID dai nomi. Non voglio usare solo ID nelle query di inserimento, per evitare errori.

    
posta TechCrunch 13.07.2016 - 00:32
fonte

2 risposte

9
  • Usare nomi come FK non è affatto ortodosso. Di solito gli FK puntano all'FK della tabella padre.
  • Potresti anche rendere name il PK di entrambe le tabelle e sbarazzarti del ID del tutto
  • Hai trovato uno degli svantaggi dell'utilizzo di PK surrogati in cui esistono valide chiavi aziendali. Dovresti essere in grado di leggere e capire la tabella delle associazioni. Dopo che tutti i dati non appartengono all'applicazione, appartengono all'organizzazione (presi da un'altra risposta).

La mia raccomandazione è che, se hai già deciso di utilizzare i surrogati, segui questi e indirizzati loro gli FK.

Inoltre; se hai creato vincoli univoci sulle colonne dei nomi, sono considerati colonne chiave, quindi in teoria puoi puntare l'FK su di loro ma lo trovo inelegante.

    
risposta data 13.07.2016 - 00:57
fonte
6

Il tuo errore è che vuoi utilizzare Name anziché ID perché Name è più leggibile. Quello che dovresti fare è rendere il tuo ID più leggibile.

Consideralo come RoleCode anziché RoleID

Role(RoleCode Pk, Name, Other_Columns)
Command(CommandID PK, RoleCode FK, Other_Columns)

Dati campione

RoleCode      Name              Other_Columns
--------      ----              -------------
Admin         Administrator
PwrUser       Power User
User          Standard User

Ora la tua integrità referenziale è sicura!

    
risposta data 13.07.2016 - 01:16
fonte

Leggi altre domande sui tag