Una chiave surrogata dovrebbe mai essere esposta a un utente?

13

Spesso in una tabella che non ha una chiave naturale, è comunque utile che gli utenti possano avere un identificatore generato in modo univoco. Se la tabella ha una chiave primaria surrogata (e in tal caso ci si aspetterebbe che lo fosse), se tale chiave fosse esposta all'utente o dovesse essere utilizzato un altro campo per tale scopo?

Un motivo per non esporre la chiave surrogata è che ora non è possibile eseguire operazioni che mantengono la relazione tra i record, ma modificare i valori chiave, come alcuni tipi di eliminazione / reinserimento, molti metodi di copia dei dati da un database all'altro, ecc.

Il vantaggio principale di esporre la chiave surrogata è la semplicità di usare un campo che hai comunque.

In quali circostanze è meglio esporre direttamente la chiave surrogata agli utenti?

    
posta psr 10.07.2013 - 22:51
fonte

7 risposte

10

Devi essere pronto per qualsiasi identificatore esposto a utenti / clienti che necessitano di essere modificati, e cambiare l'identità di una riga in un database e propagare quella modifica a tutte le chiavi esterne è solo chiedere di rompere i dati.

Se i dati non hanno una chiave aziendale naturale, è possibile aggiungere un campo aggiuntivo per un "identificatore aziendale". Questo dovrebbe essere ottimizzato per i processi per cui è usato. L'immissione della tastiera telefonica indica solo valori numerici. Per telefono / mezzo verbale evitare simboli simili (B / D, M / N, ecc.). Puoi anche generare automaticamente alcune frasi facilmente memorizzabili ("green jelly").

L'effetto di questo è che l'azienda può in seguito cambiare il modo in cui desidera fare riferimento ai record e l'unica modifica dello schema dati è l'aggiunta di una nuova colonna per quello stile di id o la trasformazione degli ID già presenti. La modifica non si diffonde attraverso l'intero database e hai ancora un ID (il surrogato) che è valido nel tempo.

In breve, eviterei di esporre le chiavi surrogate agli utenti. Come i commenti sottolineano, le chiavi surrogate non dovrebbero quasi mai cambiare. Al contrario, le aziende vogliono cambiare tutto. Se la chiave surrogata viene esposta, è solo una questione di tempo prima che l'azienda voglia cambiarla.

Come nota a margine, quando dico "esporre" qui, intendo dare la chiave all'utente con l'aspettativa che la usi direttamente (come chiamare per supportare con il loro numero d'ordine ).

    
risposta data 10.07.2013 - 23:02
fonte
4

In alcuni casi, le chiavi surrogate sono previste e hanno un senso per gli utenti. Il mio esempio preferito è "numero ordine". Il numero dell'ordine non è in realtà una chiave naturale: una chiave naturale potrebbe essere data / ora più utente o forse più di quella se ti aspetti che gli utenti generino più di un ordine nella granularità della data / ora.

Tuttavia, gli utenti comprendono e si aspettano la convenienza di un numero di ordine. Non c'è niente di male, e molto valore, se ne fai sapere agli utenti.

D'altra parte, alcune chiavi sostitutive non hanno senso per un utente. Certo, la mia compagnia di assicurazione sanitaria ha qualche chiave surrogata che mi identifica in base al mio id membro, data di nascita, corriere, ecc., Ma non mi interessa, mi interessa le informazioni sulla mia carta (che spesso include gli ID basati sul mio datore di lavoro e non sono unici in tutto l'universo ... Da qui la chiave surrogata presso la compagnia di assicurazioni).

    
risposta data 11.07.2013 - 04:13
fonte
1

Dovresti esporre una chiave surrogata solo se è un GUID / UUID generato correttamente *. L'esposizione delle chiavi surrogate sequenziali è numero 4 sui primi 10 problemi di sicurezza di OWASP.

* In pratica, è meglio presumere che non sia stato generato correttamente per questi scopi a meno che non si sappia che è stato creato da un generatore di numeri casuali o pseudo casuali crittograficamente sicuro.

    
risposta data 11.07.2013 - 19:17
fonte
1

Se una tabella non ha una chiave naturale, le chiavi surrogate consentono righe come questa.

surrogate_key  some_name
--
1              Wibble
2              Wibble
...
17             Wibble
...
235            Wibble

Chiamerei queste chiavi artificiali invece delle chiavi surrogate, ma questa distinzione non è importante per questa domanda.

Ora, supponendo che ci siano dati importanti che fanno riferimento a queste chiavi surrogate attraverso chiavi esterne, come potrebbero sapere gli utenti finali quale riga aggiornare se non conoscono i valori delle chiavi surrogate?

    
risposta data 12.07.2013 - 17:07
fonte
0

In parole semplici:

  • I surrogati devono essere nascosti all'utente.
  • Dovresti esporre un po 'di altra chiave business candidate all'utente.
  • Se non esistono altre chiavi candidate, è necessario mostrare il PK. Ma in questo caso il PK non è considerato un surrogato poiché non è un sostituto per l'altra colonna.
risposta data 11.07.2013 - 00:47
fonte
0

devi esporre SOLO un campo per un utente che fornisce informazioni utili all'utente, direttamente o per segnalare difetti all'utente.

Al contrario, dovresti SEMPRE esporre "chiavi primarie surrogate" quando sono il mezzo principale per identificare un record (semplice o complesso) per un'interazione che l'utente compie.

    
risposta data 11.07.2013 - 03:59
fonte
0

Non dovrebbe importare se esponi le chiavi o meno all'utente finale. La tua applicazione dovrebbe eseguire l'autorizzazione necessaria in modo tale che semplicemente conoscere un ID ordine, ad esempio, non possa consentire loro l'accesso a qualcosa a cui normalmente non avrebbero accesso.

avvertenza: presuppone un'applicazione web o di livello n dove l'autorizzazione lato server sia possibile / fattibile. Se hai un'app VB che esegue direttamente SQL, questo è un bel problema.

    
risposta data 12.07.2013 - 23:03
fonte