Qual è la tua opinione su utilizzando Uuid come database identificatori di riga, in particolare nelle applicazioni web?

StackOverflow https://stackoverflow.com/questions/5949

  •  08-06-2019
  •  | 
  •  

Domanda

Ho sempre preferito utilizzare interi lunghi come chiavi primarie nel database, per la semplicità e la (presunta) di velocità.Ma quando si utilizza un RESTO o Rails-come schema URL per istanze di oggetto, mi piacerebbe poi finire con Url come questo:

http://example.com/user/783

E quindi il presupposto è che ci sono anche utenti con Id 782, 781, ..., 2, e 1.Supponendo che il web app in questione è abbastanza sicuro per impedire alla gente di entrare altri numeri per visualizzare gli altri utenti senza autorizzazione, una semplice sequenza ricevuto chiave surrogata anche "perdite" il numero totale di istanze (di età superiore a questo), in questo caso gli utenti, che potrebbero essere informazioni privilegiate.(Per esempio, io sono utente #726 in stackoverflow.)

Sarebbe un UUID/GUID essere una soluzione migliore?Poi ho potuto impostare gli Url come questo:

http://example.com/user/035a46e0-6550-11dd-ad8b-0800200c9a66

Non esattamente succinta, ma c'è meno implicita informazioni sugli utenti sul display.Certo, si sa di "security through obscurity", che non è un sostituto per una corretta sicurezza, ma sembra che almeno un po ' più sicuro.

È che il beneficio vale la pena il costo e la complessità di implementazione Uuid per il web-indirizzabile istanze di oggetto?Penso che ho ancora voglia di utilizzare l'intero colonne di database PKs solo per accelerare i join.

C'è anche la questione di database rappresentazione di Uuid.So MySQL memorizza 36-stringhe di caratteri.Postgres sembra avere una più efficace rappresentazione interna (128 bit?) ma non ho provato io stesso.Qualcuno ha qualche esperienza con questo?


Aggiornamento:per chi ha chiesto solo utilizzando il nome utente nell'URL (ad esempio, http://example.com/user/yukondude), che funziona bene per le istanze di oggetto con nomi che sono unici, ma che cosa circa le miriadi di web app di oggetti che possono essere identificati solo da un numero?Gli ordini, le transazioni, le fatture, duplicare i nomi delle immagini, stackoverflow domande, ...

È stato utile?

Soluzione

Io non posso dire la web lato della domanda.Ma gli uuid sono l'ideale per le applicazioni n-tier.PK generazione possono essere decentrati:ogni client genera proprio pk senza rischio di collisione.E la differenza di velocità è generalmente di piccole dimensioni.

Assicurarsi che il database supporta un efficiente archiviazione tipo di dati (16 byte, 128 bit).Per lo meno è in grado di codificare l'uuid stringa in base64 e char(22).

Li ho usati estesamente con Firebird e non lo consiglio.

Altri suggerimenti

Per quel che vale, ho visto una lunga esecuzione di stored procedure (9+ secondi di caduta a poche centinaia di millisecondi di tempo di esecuzione semplicemente passando da un GUID primario tasti per numeri interi.Questo non per dire visualizzazione un GUID è una cattiva idea, ma come altri hanno sottolineato, di unirsi a loro, e loro indicizzazione, per definizione, non ha intenzione di essere da nessuna parte vicino così veloce come con i numeri interi.

Posso rispondere che in SQL server se si utilizza un tipo uniqueidentifier (GUID) tipo di dati e utilizzare la funzione NEWID() per creare valori si ottiene orribile frammentazione a causa delle divisioni di pagina.Il motivo è che quando si utilizza la funzione NEWID() il valore generato non è sequenziale.SQL 2005 aggiunto il NEWSEQUANTIAL() la funzione di porre rimedio a tale

Un modo per usare ancora GUID e int è quello di avere un guid e un int in una tabella in modo che il guid mappe int.il guid è utilizzato esternamente, ma l'int internamente il DB

per esempio

457180FB-C2EA-48DF-8BEF-458573DA1C10    1
9A70FF3C-B7DA-4593-93AE-4A8945943C8A    2

1 e 2 saranno utilizzati join e la guid in web app.Questa tabella sarà abbastanza stretta e dovrebbe essere abbastanza veloce per eseguire una query

Perché un paio chiave primaria con l'URI?

Perché non hanno l'URI chiave di lettura umana (o unguessable, a seconda delle tue esigenze), e il principale indice intero di base, in questo modo si ottiene il meglio di entrambi i mondi.Un sacco di software per blog che fa, dove l'esposto id della voce è identificata da un 'slug', e l'id numerico è nascosto all'interno del sistema.

Il vantaggio qui è che ora hai davvero una bella struttura di URL, che è un bene per il SEO.Ovviamente per una transazione questa non è una buona cosa, ma per qualcosa come stackoverflow, è importante (vedi URL alto...).Ottenere unicità non è difficile.Se siete veramente interessati, memorizzare un hash di slug all'interno di una tabella da qualche parte, e di fare una ricerca prima dell'inserimento.

edit: Stackoverflow non usare il sistema che ho descritto, vedere il Ragazzo commento qui sotto.

Invece di Url come questo:

http://example.com/user/783

Perché non hanno:

http://example.com/user/yukondude

Che è più amichevole con gli esseri umani e non perdita di quel po ' di informazioni?

Si potrebbe utilizzare un numero intero, che è correlato con il numero di riga, ma non è sequenziale.Per esempio, si potrebbe prendere la versione a 32 bit del sequenziale ID e riorganizzare con uno schema fisso (per esempio, il bit 1 diventa il bit 6 bit 2 diventa il bit 15, ecc..).
Questo sarà un bidirezionale di crittografia, e sarete sicuri che due Id diversi saranno sempre diverse cifrature.
Sarebbe ovviamente essere facile da decodificare, se si prende il tempo per generare abbastanza Id e ottenere lo schema, ma, se ho capito bene il tuo problema, vuoi solo per evitare di dare informazioni troppo facilmente.

Usiamo Guid come chiavi primarie per tutti i nostri tavoli si raddoppia come RowGUID per MS SQL Server di Replica.Rende molto più facile quando il client si apre all'improvviso un ufficio in un'altra parte del mondo...

Non penso che un GUID ti offre molti benefici.Utenti che odiano lungo, incomprensibile Url.

Creare un breve ID che consente di mappare l'URL, o imporre un nome utente univoco della convenzione (http://example.com/user/brianly).I ragazzi 37Signals probabilmente deridere per preoccuparsi di qualcosa di simile a questo, quando si tratta di una web app.

Per inciso si può forzare il vostro database per avviare la creazione di Id interi da un valore di base.

Dipende anche da cosa si preoccupano per la vostra applicazione.Per n-tier per applicazioni Guid/Uuid sono più semplici da implementare e sono più facili da porta tra i diversi database.Per produrre chiavi Integer alcuni database di supporto di una sequenza di oggetti in modo nativo e alcuni richiedono la costruzione su di una tabella di sequenza.

Chiavi Integer probabilmente (non ho i numeri) fornire un vantaggio per le query e le prestazioni di indicizzazione nonché l'utilizzo dello spazio.Diretta DB query è anche molto più facile utilizzando i tasti numerici, meno di copia/incolla, in quanto sono più facili da ricordare.

Io lavoro con un allievo del sistema di gestione che utilizza UUID sotto forma di un numero intero.Hanno una tabella che tenere la prossima ID univoco.

Anche se questo è probabilmente una buona idea per un punto di vista architettonico, si rende il lavoro su una base quotidiana difficile.A volte c'è bisogno di fare inserimenti di massa e avere un UUID rende molto difficile, di solito richiedono la scrittura di un cursore, invece di una semplice istruzione SELECT INTO.

Ho provato sia in real applicazioni web.

Il mio parere è che è preferibile l'uso di numeri interi e brevi, comprensibili url.

Come sviluppatore, ci si sente un po ' terribile vedere sequenziale numeri interi e sapendo che alcune informazioni su totale conteggio dei record è perdita, ma onestamente - la maggior parte delle persone probabilmente non si cura, e che l'informazione non è mai stata fondamentale per la mia attività.

Dopo aver a lungo brutto UUID url sembra a me piace molto di più di un spegnere per gli utenti normali.

Penso che questo sia uno di questi problemi che causano quasi religiosa, dibattiti, e la sua quasi inutile parlare.Vorrei solo dire usare quello che preferisci.Nel 99% dei sistemi di esso, non importa che tipo di chiave che si utilizza, in modo che i benefici (indicato in altri post) di utilizzare una sorta sopra l'altro, non sarà mai un problema.

Penso che utilizzando un GUID sarebbe la scelta migliore per la vostra situazione.Ci vuole più spazio, ma è più sicuro.

Youtube utilizza 11 caratteri con codifica base64 che offre 11^64 possibilità, e di solito sono abbastanza gestibile per scrivere.Mi chiedo se in grado di offrire prestazioni migliori rispetto a un pieno sul UUID.UUID convertiti in base 64 sarebbe il doppio della dimensione del credo.

Ulteriori informazioni possono essere trovate qui: https://www.youtube.com/watch?v=gocwRvLhDf8

Fino a quando si utilizza un DB sistema di archiviazione efficiente, l'HDD è a buon mercato in questi giorni comunque...

So GUID può essere un b*tch di lavorare con alcune volte e venire con alcune query sovraccarico, tuttavia, da una prospettiva di sicurezza sono un salvatore.

Pensando sicurezza tramite segretezza si adattano bene quando si forma oscura di URI e la costruzione di normalizzare il DB con tabelle, Record e di una Colonna definita per la sicurezza, si può andare storto con GUID, provate a farlo con un numero intero a base di id.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top