Ich habe es immer vorgezogen, lange Ganzzahlen als Primärschlüssel in Datenbanken zu verwenden, um die Einfachheit und (angenommene) Geschwindigkeit zu gewährleisten. Wenn ich jedoch ein REST- oder Rails-ähnliches URL-Schema für Objektinstanzen verwende, erhalte ich folgende URLs:
http://example.com/user/783
Und dann wird davon ausgegangen, dass es auch Benutzer mit den IDs 782, 781, ..., 2 und 1 gibt. Angenommen, die betreffende Web-App ist sicher genug, um zu verhindern, dass Personen andere Nummern eingeben, um andere Benutzer ohne Berechtigung anzuzeigen. A. Ein einfacher, nacheinander zugewiesener Ersatzschlüssel "verliert" auch die Gesamtzahl der Instanzen (älter als diese), in diesem Fall Benutzer, bei denen es sich möglicherweise um privilegierte Informationen handelt. (Zum Beispiel bin ich Benutzer # 726 im Stackoverflow.)
Wäre eine UUID / GUID eine bessere Lösung? Dann könnte ich URLs wie folgt einrichten:
http://example.com/user/035a46e0-6550-11dd-ad8b-0800200c9a66
Nicht gerade prägnant, aber es werden weniger implizite Informationen über Benutzer angezeigt. Sicher, es riecht nach "Sicherheit durch Dunkelheit", was kein Ersatz für angemessene Sicherheit ist, aber es scheint zumindest ein wenig sicherer zu sein.
Ist dieser Vorteil die Kosten und die Komplexität der Implementierung von UUIDs für webadressierbare Objektinstanzen wert? Ich denke, dass ich immer noch ganzzahlige Spalten als Datenbank-PKs verwenden möchte, um Joins zu beschleunigen.
Es gibt auch die Frage der datenbankinternen Darstellung von UUIDs. Ich weiß, dass MySQL sie als Zeichenfolgen mit 36 Zeichen speichert. Postgres scheint eine effizientere interne Darstellung zu haben (128 Bit?), Aber ich habe es selbst nicht ausprobiert. Hat jemand irgendwelche Erfahrungen damit?
Update: Für diejenigen, die nach der Verwendung des Benutzernamens in der URL gefragt haben (z. B. http://example.com/user/yukondude ), funktioniert dies gut für Objektinstanzen mit eindeutigen Namen, aber was ist mit den Millionen von Web App-Objekte, die wirklich nur anhand der Nummer identifiziert werden können? Bestellungen, Transaktionen, Rechnungen, doppelte Bildnamen, Fragen zum Stapelüberlauf, ...