Каково Ваше мнение об использовании UUID в качестве идентификаторов строк базы данных, особенно в веб-приложениях?


Я всегда предпочитал использовать длинные целые числа в качестве первичных ключей в базах данных, для простоты и (предполагаемых) скорости. Но при использовании остальное или 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

не совсем лаконично, но там меньше подразумеваемой информации о пользователях на дисплее. Конечно, это попахивает "безопасностью через неизвестность", которой нет замените надлежащую безопасность, но это кажется, по крайней мере, немного более безопасным.

стоит ли эта выгода стоимости и сложности реализации UUIDs для веб-адресуемых экземпляров объектов? Я думаю, что я все равно хочу использовать целочисленные столбцы в качестве PKS базы данных только для ускорения соединений.

есть также вопрос о представлении UUIDs в базе данных. Я знаю, что MySQL хранит их как 36-символьные строки. Postgres, похоже, имеет более эффективное внутреннее представление (128 бит?) но я сам не пробовал. У кого-нибудь есть опыт с этим?


Update: для тех, кто спрашивал только об использовании имени пользователя в URL (например,http://example.com/user/yukondude), это отлично работает для экземпляров объектов с уникальными именами, но как насчет zillions объектов веб-приложения, которые действительно могут быть идентифицированы только по номеру? Заказы, транзакции, счета-фактуры, дубликаты имен изображений, вопросы stackoverflow,...

15 68

15 ответов:

Я не могу сказать о веб-части вашего вопроса. Но uuids отлично подходит для n-уровневых приложений. Генерация ПК может быть децентрализована: каждый клиент генерирует свой собственный ПК без риска столкновения. И разница в скорости вообще небольшая.

убедитесь, что ваша база данных поддерживает эффективный тип хранения данных (16 байт, 128 бит). По крайней мере, вы можете кодировать строку UUID в base64 и использовать char(22).

Я широко использовал их с Firebird и делать рекомендовать.

для чего это стоит, я видел, что длительная хранимая процедура (9 + секунд) падает всего на несколько сотен миллисекунд времени выполнения, просто переключаясь с первичных ключей GUID на целые числа. Это не значит показывать GUID-это плохая идея, но, как указывали другие, присоединение к ним и индексирование их, по определению, не будет таким быстрым, как с целыми числами.

Я могу ответить вам, что в SQL server, если вы используете тип данных uniqueidentifier (GUID) и используете функцию NEWID() для создания значений, вы получите ужасную фрагментацию из-за разделения страниц. Причина в том, что при использовании NEWID() генерируемое значение не является последовательным. SQL 2005 добавил функцию NEWSEQUANTIAL (), чтобы исправить это

один из способов по-прежнему использовать GUID и int-это иметь guid и int в таблице, чтобы guid отображался на int. guid используется внешне, но int внутренне в БД

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

1 и 2 будут использоваться в соединениях и GUID в веб-приложение. Эта таблица будет довольно узкой и должна быть довольно быстрой для запроса

зачем связывать ваш первичный ключ с вашим URI?

Почему бы не сделать ваш ключ URI читаемым человеком (или не угадываемым, в зависимости от ваших потребностей), а ваш основной индекс целочисленным, таким образом, вы получите лучшее из обоих миров. Многие программы для блогов делают это, когда открытый идентификатор записи идентифицируется "слизняком", а числовой идентификатор скрыт внутри системы.

дополнительным преимуществом здесь является то, что теперь у вас есть действительно хорошая структура URL, которая хороша для ОПТИМИЗАЦИЯ ПОИСКОВЫХ СИСТЕМ. Очевидно, что для транзакции это не очень хорошо, но для чего-то вроде stackoverflow это важно (см. URL up top...). Получить уникальность не так уж и сложно. Если вы действительно обеспокоены, сохраните хэш слизняка внутри таблицы где-нибудь и выполните поиск перед вставкой.

edit: Stackoverflow не совсем использует систему, которую я описываю, см. комментарий парня ниже.

а не URL-адреса, как это:

http://example.com/user/783

почему бы и нет:

http://example.com/user/yukondude

что более дружелюбно к людям и не пропускает эту крошечную информацию?

вы можете использовать целое число, которое связано с номером строки, но не является последовательным. Например, вы можете взять 32 бита последовательного идентификатора и переставить их с фиксированной схемой (например, бит 1 становится битом 6, бит 2 становится битом 15 и т. д..).
Это будет двунаправленное шифрование, и вы будете уверены, что два разных идентификатора всегда будут иметь разные шифрования.
Очевидно, было бы легко декодировать, если бы потребовалось время, чтобы сгенерировать достаточное количество идентификаторов и получить но, если я правильно понимаю вашу проблему, вы просто хотите не отдавать информацию слишком легко.

мы используем GUID в качестве первичных ключей для всех наших таблиц, поскольку он удваивается как RowGUID для репликации MS SQL Server. Делает это очень легко, когда клиент вдруг открывает офис в другой части мира...

Я не думаю, что GUID дает вам много преимуществ. Пользователи ненавидят длинные, непонятные url.

создайте более короткий идентификатор, который можно сопоставить с URL-адресом, или примените соглашение об уникальном имени пользователя (http://example.com/user/brianly). ребята на мнению 37signals вероятно, будет издеваться над вами за беспокойство о чем-то подобном, когда речь заходит о веб-приложении.

Кстати, вы можете заставить свою базу данных начать создавать целочисленные идентификаторы из базового значения.

Это также зависит от того, что вы заботитесь о вашем приложении. Для n-уровневых приложений GUID / UUID проще реализовать и легче переносить между различными базами данных. Для создания целочисленных ключей некоторые базы данных поддерживают объект последовательности изначально, а некоторые требуют пользовательского построения таблицы последовательности.

целочисленные ключи, вероятно (у меня нет чисел), обеспечивают преимущество для производительности запросов и индексирования, а также использования пространства. Прямой запрос БД также намного проще с помощью цифровые клавиши, меньше копирования / вставки, поскольку они легче запоминаются.

Я работаю с системой управления студентами, которая использует UUID в виде целого числа. У них есть таблица, которая содержит следующий уникальный идентификатор.

хотя это, вероятно, хорошая идея для архитектурной точки зрения, это делает работу с на ежедневной основе трудно. Иногда возникает необходимость делать массовые вставки, и наличие UUID делает это очень сложным, обычно требуя написания курсора вместо простого оператора SELECT INTO.

Я пробовал оба в реальных веб-приложениях.

Я считаю, что предпочтительнее использовать целые числа и иметь короткие, понятные URL-адреса.

как разработчик, он чувствует себя немного ужасно, видя последовательные целые числа и зная, что некоторая информация об общем количестве записей просачивается, но, честно говоря, большинству людей, вероятно, все равно, и эта информация никогда не была критической для моего бизнеса.

длинные уродливые URL-адреса используется UUID, кажется, нравится скорее отключить для обычных пользователей.

Я думаю, что это один из тех вопросов, которые вызывают квазирелигиозные дебаты, и его почти бесполезно говорить. Я бы просто сказал использовать то, что вы предпочитаете. В 99% систем это будет независимо от того, какой тип ключа вы используете, поэтому пользы (сказано в других постах) с помощью одного вида над другим никогда не будет проблемой.

Я думаю, что использование GUID будет лучшим выбором в вашей ситуации. Он занимает больше места, но это более безопасно.

Youtube использует 11 символов с кодировкой base64, которая предлагает 11^64 возможностей, и они обычно довольно управляемы для записи. Интересно, будет ли это предлагать лучшую производительность, чем полный UUID. UUID, преобразованный в базу 64, будет вдвое больше, чем я считаю.

дополнительную информацию можно найти здесь:https://www.youtube.com/watch?v=gocwRvLhDf8

пока вы используете систему БД с эффективным хранилищем, HDD дешев в эти дни в любом случае...

Я знаю, что GUID может быть b*tch для работы с некоторыми временами и иметь некоторые накладные расходы на запросы, однако с точки зрения безопасности они являются спасителем.

думая безопасность по неясности они хорошо подходят при формировании неясных URI и создании нормализованных БД с таблицей, записью и столбцом определенной безопасности вы не можете пойти не так с GUID, попробуйте сделать это с целым числом на основе удостоверения личности.