Я всегда предпочитал использовать длинные целые числа в качестве первичных ключей в базах данных, для простоты и (предполагаемой) скорости. Но при использовании REST или Rails-подобной схемы URL-адресов для экземпляров объекта, я бы тогда закончил с URL-адресами вроде этого:
http://example.com/user/783
И тогда предполагается, что есть также пользователи с идентификаторами 782, 781,..., 2 и 1. Предполагая, что рассматриваемое веб-приложение достаточно безопасно, чтобы люди не вводили другие номера для просмотра других пользователей без авторизация, простой последовательно назначенный суррогатный ключ также "утешает" общее количество экземпляров (старше этого), в этом случае пользователи, которые могут быть привилегированной информацией. (Например, я пользователь # 726 в stackoverflow.)
Было бы лучше UUID/GUID? Затем я мог настроить такие URL-адреса:
http://example.com/user/035a46e0-6550-11dd-ad8b-0800200c9a66
Не совсем лаконично, но там меньше подразумеваемой информации о отображаемых пользователях. Несомненно, это привносит "безопасность через неясность", которая не подменяет надлежащую безопасность, но кажется, по крайней мере, немного более безопасной.
Является ли это выгодной стоимостью и сложностью реализации UUID для веб-адресов объектов? Я думаю, что я все же хотел бы использовать целые столбцы в качестве базы данных PK только для ускорения объединений.
Также возникает вопрос о представлении UUID в базе данных. Я знаю, что MySQL хранит их как строки с 36 символами. Postgres, кажется, имеет более эффективное внутреннее представление (128 бит?), Но я сам не пробовал. У кого-нибудь есть опыт?
Обновление: для тех, кто попросил просто использовать имя пользователя в URL-адресе (например, http://example.com/user/yukondude), который отлично подходит для объекта экземпляры с уникальными именами, но как насчет zillions объектов веб-приложения, которые действительно могут быть идентифицированы только по числу? Заказы, транзакции, счета-фактуры, дубликаты имен изображений, вопросы о стеке,...