Chiavi univoche e primarie su un database (mysql)

0

Ho qualche dubbio qui ... Se ho una tabella relativa a login username / password come posso assicurare che non ci saranno altre corrispondenze della stessa nome utente e password nella stessa tabella utilizzando sql? Ad esempio:

>username: username
>password: password

^ questo utente si è appena iscritto. Quindi si applicano le seguenti condizioni:

1º there can't be any more users named "username"

2º most surely there can't be any more users named "username" AND with the same password

quindi, in che modo esattamente dovrei inserire i nomi chiave nel database? L'ID è primario, dovrei inserire nome utente E password come unico per formare una coppia univoca ed evitare un altro inserimento identico?

    
posta user111671 01.01.2014 - 18:32
fonte

3 risposte

5

I nomi utente devono essere unici, identificano un utente. Le password no. Le password devono essere comunque mantenute segrete. Non puoi dire a un utente "Ehi, scegli un'altra password, un altro utente sta già usando questo". Se è un hacker, lo adorerà!

Non dovresti comunque memorizzare le password. Invece conserva i loro hash. Vedi Hash delle password salate - Farlo bene .

Se hai due colonne che devono essere uniche, la loro combinazione deve essere unica o deve essere univoca in modo indipendente.

Un esempio di una combinazione univoca sono dati mensili identificati per anno e mese memorizzati in due colonne separate. Qui avrebbe senso usare queste due colonne come chiave primaria (PK). Se hai già un altro PK, crea un indice univoco o un vincolo univoco su queste due colonne. Vedi anche Quando dovrei usare un vincolo univoco invece di un indice univoco?

Un esempio di due colonne univoche indipendenti sarebbe un nome utente e un nickname. Il nome utente è utilizzato per gli accessi; il nickname viene mostrato ad altri utenti. Qui userò il nome utente come PK e creerò un indice univoco sul nickname.

Il PK è il mezzo principale per identificare un record. Il PK viene anche referenziato in vincoli di chiave esterna quando si definiscono le relazioni da 1 a n o 1 a 1 tra le tabelle. È una buona pratica non scegliere una colonna il cui valore può cambiare nel tempo. Se agli utenti fosse permesso cambiare il loro nome utente, ad esempio, scegliere una colonna di autoincremento come PK e creare un indice univoco sul nome utente.

    
risposta data 01.01.2014 - 18:49
fonte
2

Aggiungi un vincolo univoco sulla colonna del nome utente. Qualsiasi logica password dovrebbe essere inserita nel codice dell'applicazione, ma è meglio controllare semplicemente che le password siano abbastanza potenti.

    
risposta data 01.01.2014 - 19:02
fonte
1

Penso che l'implementazione migliore sia che i nomi utente siano unici, ma le password possono avere duplicazioni. È anche pratica comune nella maggior parte delle app web. Puoi impostare il nome utente come chiave primaria nella tua tabella

    
risposta data 02.01.2014 - 11:05
fonte

Leggi altre domande sui tag