Подтвердить что ты не робот

Лучше ли использовать уникальный идентификатор (GUID) или bigint для столбца идентификации?

Для SQL-сервера лучше использовать уникальный идентификатор (GUID) или bigint для столбца идентификации?

4b9b3361

Ответ 1

Это зависит от того, что вы делаете:

  • Если скорость является основной проблемой, тогда простой старый int, вероятно, достаточно большой.
  • Если у вас действительно будет более 2 миллиардов (с B;)) записей, используйте bigint или последовательный указатель.
  • Если вам нужно легко синхронизировать с удаленными записями, то Guid действительно замечательный.

Обновление
Некоторые дополнительные (менее очевидные) заметки о гидах:

  • Они могут быть жесткими для индексов, и это сокращает базовую производительность базы данных.
  • Вы можете использовать последовательные подсказки, чтобы вернуть некоторую производительность индексации, но отказаться от некоторой случайности, используемой в пункте 2.
  • Гиды могут быть трудно отлаживать вручную (where id='xxx-xxx-xxxxx'), но вы также можете получить их обратно через последовательные концы (where id='xxx-xxx' + '123').
  • По той же причине Гиды могут сделать атаки на основе ID более сложными, но не невозможными. (Вы не можете просто набрать 'http://example.com?userid=xxxx' и ожидать получить результат для чужой учетной записи).

Ответ 3

В общем, я бы рекомендовал BIGINT над GUID (поскольку большие и медленные гиды), но вопрос в том, что вам это нужно? (I.e. вы делаете репликацию?) Если вы ожидаете менее 2 миллиардов строк, традиционный INT будет в порядке.

Ответ 4

Выполняете ли вы репликацию или у вас есть продавцы, которые запускают отключенные базы данных, которые необходимо объединить, используйте GUID. В противном случае я бы пошел на int или bigint. В долгосрочной перспективе им гораздо легче справиться.

Ответ 5

Зависит от того, что вам нужно. DB Производительность получала бы от целого числа, тогда как GUID были бы полезны для репликации и не требовали бы услышать от БД, какая идентификация была создана, то есть код мог бы создать идентификатор GUID перед вставкой в ​​строку.

Ответ 6

Если вы планируете использовать репликацию слиянием, то ROWGUIDCOL полезно для производительности (см. здесь для информации). В противном случае нам нужна дополнительная информация о том, что такое определение "лучше"; лучше для чего?

Ответ 7

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

Ответ 8

Это действительно зависит от того, ожидаете ли вы репликации на картинке. Для репликации требуется UUID строки, поэтому, если вы планируете делать это, вы также можете сделать это заранее.

Ответ 9

Если вам не нужна настоящая потребность в GUID, например, возможность генерировать ключи где угодно, а не только на сервере, тогда я буду придерживаться ключей, основанных на INTEGER. GUID являются дорогостоящими для создания и затрудняют фактическое рассмотрение данных. Плюс, вы когда-нибудь пытались ввести GUID в SQL-запрос? Это больно!

Ответ 10

Я с Эндрю Роллингсом.

Теперь вы можете утверждать, что эффективность пространства. Int - это что, 8 байтов max? Руководство будет намного дольше.

Но у меня есть две основные причины предпочтения: читаемость и время доступа. Числа мне легче, чем GUID (так как я всегда могу найти следующую/предыдущую запись легко).

Что касается времени доступа, обратите внимание, что некоторые БД могут начать иметь БОЛЬШИЕ проблемы с GUID. Я знаю, что это имеет место с MySQL (MySQL InnoDB Primary Key Choice: GUID/UUID vs Integer Insert Performance). Это может быть не очень проблематично с SQL Server, но это то, на что нужно следить.

Я бы сказал, что вы используете INT или BIGINT. Единственный раз, когда я думаю, что вы хотите, чтобы GUID был, когда вы собираетесь их выдавать, и не хотите, чтобы люди могли угадать идентификаторы других записей по соображениям безопасности.

Ответ 11

Для использования GUID может быть несколько аспектов или требований.

  • Если первичный ключ имеет любой числовой тип (Int, BigInt или любой другой), то либо вам нужно сделать его столбец Identity, либо вам нужно проверить последнее сохраненное значение в таблице.
  • И в этом случае, если запись в внешней таблице сохраняется как транзакция, тогда было бы трудно получить последнее значение идентификатора первичного ключа. Например, если используется IDENT_CURRENT, то это будет снова эффектом при сохранении записи во внешнем ключе.
  • Таким образом, в случае сохранения записей как для транзакций было бы удобно сначала генерировать Guid для первичного ключа, а затем сохранить сгенерированный ключ (Guid) в первичной и внешней таблицах.