Я читаю вокруг причин использовать или нет Guid
и int
.
int
меньше, быстрее, легко запоминается, сохраняет хронологическую последовательность. И что касается Guid
, единственное преимущество, которое я нашел, - то, что это уникально. В каком случае Guid
будет лучше, чем int
и почему?
Из того, что я видел, int
нет недостатков, кроме как по количественному ограничению, которое во многих случаях не имеет значения.
Почему именно был Guid
создан? Я на самом деле думаю, что у него есть цель, отличная от первичного ключа простой таблицы. (Какой-нибудь пример использования реального приложения Guid
для чего-то?)
(Guid = UniqueIdentifier) тип в SQL Server
int
не имеет недостатков, кроме как по количественному ограничению, которое во многих случаях не имеет значения.»: фактически, в этом контексте INT против GUID, верхний предел 32-разрядного соINT
знаком совершенно не имеет значения, учитывая, что верхний предел подписанного 64-разрядныйBIGINT
- это далеко за пределы практически всех применений (даже более того, если вы начнете нумерацию с нижнего предела; то же самое и дляINT
), и он по-прежнему вдвое меньше GUID (8 байт вместо 16) и последовательного.Ответы:
Это было задано в переполнении стека здесь и здесь .
Пост Джеффа многое объясняет о плюсах и минусах использования GUID.
Если вы уверены в производительности и не планируете реплицировать или объединять записи, используйте
int
и установите автоматическое увеличение ( идентификация в SQL Server ).источник
UNIQUEIDENTIFIER
за того,INT
чтоINT
имеет верхний предел, является довольно плохой аргументацией, поскольку быть безграничным, хотя и достаточно верным, не является практическим преимуществом. Вы можете легко удвоить эффективную емкость aINT
, начав ее с нижнего предела (-2.14 млрд.) Вместо 1. Или, если полных 4,3 млрд. Недостаточно, начните с a,BIGINT
который по-прежнему составляет всего 8 байт. по сравнению с 16 для GUID, и это последовательно.Если вы синхронизируете свои данные с внешним источником, постоянный GUID может быть намного лучше. Быстрый пример использования GUID - это инструмент, который отправляется клиенту для сканирования его сети и выполнения определенных классов автоматического обнаружения, сохранения найденных записей, а затем все записи клиентов объединяются в центральную базу данных. назад на нашем конце. Если бы мы использовали целое число, у нас было бы 7398 «1», и было бы намного сложнее отследить, какое «1» было каким.
источник
Я использовал гибридный подход с успехом. Таблицы содержат ОБА целочисленный
id
столбец первичного ключа с автоинкрементом Иguid
столбец.guid
Может использоваться по мере необходимости для глобально уникальным образом идентифицировать строку иid
может быть использована для запросов, сортировки и человеческой идентификации ряда.источник
id
уже достаточно, чтобы люди могли идентифицировать строку?INT
ПК. Я нахожу странным, что этот подход не намного более распространен, учитывая, что он является лучшим из обоих миров. Кажется, что большинство людей просто предпочитают решать проблемы в очень абсолютистских терминах, не понимая, что PK не должен быть GUID, чтобы приложение все еще использовало GUID для глобальной уникальности и / или переносимости.В некоторых передовых практиках все еще упоминается, что вы должны использовать тип данных, который содержит меньше памяти, чем весь набор значений, которые вы собираетесь использовать. Например, если вы используете его для хранения числа работодателей в малом бизнесе и вряд ли получите 100, тогда никто не посоветует использовать значение bigint, тогда как int (даже smallint) подойдет.
Конечно, недостатком этого является «Скажи нет масштабируемости!»
Кроме того, я знаю, что это не совсем связано, но есть еще один фактор в этом отношении. Когда это не так уж и сложно, я обычно стараюсь рекомендовать использовать не сгенерированный первичный ключ, если это имеет смысл. Например, если вы сохраняете информацию о драйвере, не беспокойтесь о создании нового автоматически сгенерированного столбца для «ID», просто используйте номер лицензии.Я знаю, что это звучит действительно очевидно, но я вижу, что это часто забывают.Для контекста: эта часть ответа была основана на теоретическом подходе к данным, где вы хотите, чтобы ваш PK был уникальным идентификатором данных для записи. В большинстве случаев мы создаем их, когда они уже существуют, отсюда и предыдущий ответ.
Однако очень редко вы можете жестко контролировать эти точки данных, и поэтому вам может потребоваться внести исправления или корректировки. Вы не можете сделать это с первичными ключами (ну, вы можете, но это может быть боль).
Спасибо @VahiD за разъяснения.
источник
Использование идентификаторов автоматического увеличения может привести к утечке информации о вашей деловой активности. Если вы управляете магазином и используете
order_id
для публичного определения покупки, то любой может узнать ваше ежемесячное количество продаж с помощью простой арифметики.источник
Другое дело, как генерируются GUID. mrdenny правильно указал, что даже если используется newsequentialid (), перезапуск экземпляров заставляет новые значения начинаться с «дыр», оставленных в предыдущей обработке. Еще одна вещь, которая влияет на «последовательные» GUID - это сетевая карта. Если я правильно помню, UID NIC используется как часть алгоритма GUID. Если NIC заменяется, нет гарантии, что UID будет иметь более высокое значение, чтобы поддерживать последовательный аспект вещей. Я также не уверен, как несколько сетевых карт могут повлиять на присвоение значений с помощью алгоритма.
Просто мысль, и я надеюсь, что я правильно помню. Хорошего дня!
источник
Используйте оба
Используйте int / Bigint для первичного ключа, поскольку его легко поддерживать и использовать в качестве отношений внешнего ключа.
Но свяжите столбец с GUID, чтобы каждая строка также имела уникальный столбец
источник
int
иguid
, как вы предлагаете в своем ответе. И кроме того, я не говорил об объяснении вашего предложения только мне - я хотел сказать, что вы можете обновить свой ответ . Кстати, вы знаете, что другой ответчик уже предложил то же самое (более или менее), что и вы ?