Una chiave surrogata dovrebbe mai essere esposta a un utente?


14

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 te lo aspetteresti sicuramente) tale chiave dovrebbe essere esposta all'utente o dovrebbe essere usato un altro campo a tale scopo?

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

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

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


Parte di questa domanda è che devi definire "utenti". Gli utenti potrebbero essere consumatori di un'API esposta o di esseri umani carnosi. La risposta non sarà la stessa per entrambi.
James Snell,

1
Essere umani carnosi.
ps

Ogni situazione in cui i dati potrebbero essere identificati in modo diverso dovrebbe avere un identificatore diverso. Quindi, se un nuovo sistema si connette con i tuoi dati, aspettati che abbia il suo PK e aggiungilo ai tuoi dati. La visibilità di "brutte sacche per lo più di acqua" conta come un "sistema" per questo scenario. La mia soluzione preferita è archiviare le chiavi e i timestamp (aggiungere, modificare ed eliminare) per le entità in una tabella speciale. In questo modo, i dati possono essere facilmente distribuiti.

Risposte:


10

Devi essere pronto per qualsiasi identificatore esposto agli utenti / clienti che necessitano di essere modificati, e cambiare l'identità di una riga in un database e propagare tale modifica a tutte le chiavi esterne richiede solo di interrompere 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 è utilizzato. La voce della tastiera del telefono significa solo un numero. Al telefono / verbale significa evitare simboli di suono simili (B / D, M / N, ecc.). Puoi anche generare automaticamente qualche frase facilmente memorabile ("gelatina verde").

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

In breve, eviterei di esporre agli utenti le chiavi surrogate. Come sottolineano i commenti, le chiavi surrogate non dovrebbero quasi mai cambiare. Al contrario, le aziende vogliono cambiare tutto. Se la chiave surrogata è 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 utilizzino direttamente (come chiamare per supportare con il loro numero d'ordine).


5
Questa risposta non ha senso. Le chiavi surrogate non cambiano mai e non hai fatto caso per non esporle agli utenti.
Robert Harvey,

1
mai dire mai. cosa succederebbe se quest'ultimo progetto portasse a un consolidamento record? cosa succede se hai bisogno di ingrandire e convertire lontano dalle identità?
DougM,

3
@DougM: quindi scrivere i record in una nuova tabella consolidata con la propria chiave surrogata e mantenere le chiavi originali in campi separati nella nuova tabella (e un campo che identifica la tabella di origine originale) come riferimenti, se necessario. Questo tipo di consolidamento dovrebbe essere straordinariamente raro, e solo a causa di un progetto mal riuscito. Ripeti dopo di me: surrogato. Keys. Mai. Modificare. Ecco perché sono surrogati.
Robert Harvey,

2
@RobertHarvey Sono d'accordo sul fatto che le chiavi surrogate non dovrebbero mai cambiare, motivo per cui penso che creino identificatori esterni scadenti. Alla fine un cliente vorrà cambiare il modo in cui si riferiscono a un record. A quel punto hai costruito il tuo intero sistema attorno a chiavi surrogate immutabili o hai pensato in anticipo e hai messo un livello di riferimento indiretto tra identificativi aziendali e chiavi surrogate.
Chris Pitman,

2
@sqlvogel: Renderebbe le cose più chiare se usassi il termine "chiave primaria generata dal sistema" anziché "surrogato?" Sono d'accordo che potresti voler cambiare l'algoritmo che genera le chiavi surrogate, ma ciò non cambia la loro qualità fondamentalmente immutabile.
Robert Harvey,

4

In alcuni casi, sono previste chiavi surrogate e hanno senso per gli utenti. Il mio esempio preferito è "numero d'ordine". Il numero dell'ordine non è in realtà una chiave naturale: una chiave naturale potrebbe essere il timestamp più l'utente, o forse di più se si prevede che gli utenti generino più di un ordine all'interno della granularità del timestamp.

Tuttavia, gli utenti comprendono e si aspettano la comodità di un numero d'ordine. Non vi è alcun danno e molto valore se si informano gli utenti su di loro.

D'altra parte, alcuni tasti surrogati non hanno senso per un utente. Certo, la mia compagnia di assicurazione sanitaria ha una chiave surrogata che mi identifica in base all'ID del mio membro, alla data di nascita, al corriere, ecc., Ma non mi interessa, mi preoccupo delle informazioni sulla mia carta (che spesso include ID sul mio datore di lavoro e non sono unici in tutto l'universo ... Da qui la chiave surrogata della compagnia assicurativa).


Se un utente lo comprende e si aspetta di interagire con esso, non è più una chiave surrogata. Le chiavi surrogate sono definite come prive di significato commerciale. Solo perché è un numero ID non significa necessariamente che sia un surrogato. Inoltre, "una chiave surrogata che mi identifica in base al mio ID membro, data di nascita [...]" non ha senso. Stai dicendo che la loro chiave surrogata (che non ha significato commerciale) ti identifica in base a cose che potrebbero comporre una chiave naturale?
Kyle McVay,

Spesso, ciò che accade è che ti viene assegnato un numero ID dipendente in modo tale che nel sistema dei dipendenti sei differenziato da altre persone con lo stesso nome. Sulla tua tessera d'assicurazione, può elencare la tua azienda e l'ID del dipendente. Ma la compagnia di assicurazione sanitaria genererà spesso il proprio ID interno che può utilizzare su tutti i suoi sistemi invece di utilizzare il nome, la data di nascita e gli ID dipendenti che riceve dal datore di lavoro. Queste chiavi generate sono surrogate o naturali? Dipende da chi chiedi (controlla 2 definizioni alternative su en.wikipedia.org/wiki/Surrogate_key )
Alan Shutko

1

È necessario esporre una chiave surrogata solo se è un GUID / UUID generato correttamente *. L'esposizione di chiavi surrogate sequenziali è il numero 4 dei 10 principali problemi di sicurezza di OWASP.

* In pratica, è meglio supporre 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 sicuro crittograficamente.


2
Non è chiaro dalla tua risposta come un GUID migliora la sicurezza.
Robert Harvey,

1
@RobertHarvey - Presumo perché non sono sequenziali e quindi non possono essere indovinati.
Bobson,


@RobertHarvey, chiarito.
Peter Taylor,

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 tramite chiavi esterne, come fanno gli utenti finali a sapere quale riga aggiornare se non conoscono i valori delle chiavi surrogate?


È un po 'contraddittorio etichettare la colonna "surrogate_key" ma poi dire che sono "chiavi artificiali anziché surrogate". Se stai chiamando queste chiavi artificiali perché non hanno significato commerciale e servono solo come identificatori univoci, allora questa chiave dovrebbe essere naturalizzata (esposta) e dovrebbe essere creata una nuova chiave surrogata. ad esempio, rinominare la surrogate_key naturalizzata in qualcosa con significato aziendale, esporla ai clienti e creare una nuova colonna simile per essere la vera surrogata delle operazioni interne. Meno che ideale, ma comunque meglio che esporre un vero surrogato.
Kyle McVay,

@KyleMcVay: non è contraddittorio. Onora il significato di surrogato , la cui idea essenziale è "sostituire". Una chiave surrogata sostituisce una chiave naturale. (Codd e la teoria relazionale in generale usano la chiave surrogata in questo senso.) Una tabella che non ha una chiave naturale non può avere una chiave surrogata in quel senso. Ma può avere un valore arbitrario che viene utilizzato al posto di qualsiasi altra cosa. Questo è ciò che definirei una chiave artificiale.
Mike Sherrill 'Cat Recall',

Le tue definizioni non sono imprecise, ma penso che la chiave surrogata abbia assunto un significato extra specifico per il settore oltre la parola surrogata . Se hai intenzione di esporre una chiave a un cliente, direi che quella chiave ora ha un significato commerciale; è stato naturalizzato e ora dovrebbe essere considerato logicamente parte dell'entità che rappresenta. Secondo questa logica, non esiste una chiave surrogata esposta. Se hai intenzione di esporre una chiave artificiale, non è più una chiave surrogata e ne hai bisogno di una nuova.
Kyle McVay,

0

Nelle parole di laici:

  • I surrogati dovrebbero essere nascosti all'utente.
  • È necessario esporre all'utente un'altra chiave del candidato commerciale.
  • Se non esiste un'altra chiave candidata, è necessario mostrare il PK. Ma in questo caso il PK non è considerato un surrogato poiché non sostituisce un'altra colonna.

Perché deve essere mostrato il PK? Penso che sia la mia domanda: se un PK generato automaticamente è correttamente chiamato chiave surrogata è tangenziale.
ps

1
@psr Il titolo della tua domanda dice "le chiavi surrogate saranno mai esposte". Ho detto no. Ma devi mostrare qualche altra chiave. Se non esiste un'altra chiave, devi mostrare l'unica chiave che hai. Tangenzialmente chiarisco che in quei casi la chiave non è realmente un surrogato perché non sostituisce qualsiasi altra colonna.
Tulains Córdova,

La domanda è se devi aggiungere una colonna o mostrare la chiave che hai.
ps

@psr Ho riformulato la mia risposta per renderlo più chiaro.
Tulains Córdova,

1
Trovo che sia una distinzione materialmente insignificante. Se la tua regola è che ogni tavolo ha una chiave artificiale (che è la mia) e che solo le chiavi artificiali partecipano ai join (che è anche il mio principio), allora l'idea che una chiave è surrogata perché altre chiavi potrebbero essere disponibile è irrilevante.
Robert Harvey,

0

dovresti esporre SOLO un campo a un utente che fornisca all'utente informazioni utili, direttamente o nel segnalare i difetti.

viceversa, si dovrebbe SEMPRE esporre "chiavi primarie surrogate" quando sono i mezzi principali per identificare un record (semplice o complesso) per un'interazione eseguita dall'utente.


0

Non dovrebbe importare se si espongono le chiavi o meno all'utente finale. L'applicazione deve eseguire l'autorizzazione necessaria in modo tale che la semplice conoscenza di un ID ordine, ad esempio, non possa consentire loro di accedere a qualcosa a cui normalmente non avrebbero accesso.

avvertenza: presuppone un'applicazione basata su Web o di livello n in cui l'autorizzazione lato server è possibile / fattibile. Se hai un'app VB che esegue direttamente sql, questo è un altro problema.


Che dire di non poter inserire e poi cancellare i record, preservando le relazioni con le chiavi esterne, come menzionato nella domanda?
psr

Che cosa ha a che fare con l'esposizione della chiave all'utente? Forse non capisco il tuo uso del termine "esposizione". Sto lavorando dal presupposto che intendi "in grado di essere visto dall'utente".
GrandmasterB,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.