Какой тип данных рекомендуется использовать для столбцов ID?

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

по какой-то причине я предпочитаю использовать Guids (uniqueidentifier в MSSQL) для поля первичного ключа, но я действительно не знаю, почему это было бы лучше. Во многих учебниках я прошел через себя в последнее время автоматически incremented int использовался. Я вижу pro и cons с обоими:

  • A Guid всегда одинакового размера и длины, и нет причин беспокоиться о том, что они закончатся, в то время как есть предел тому, сколько записей вы могли бы иметь, прежде чем у вас закончатся номера, которые вписываются в int.
  • int (по крайней мере, в C#) тип nullable, который открывается для нескольких ярлыков при запросе данных.
  • и int легче читать.
  • держу пари, вы могли бы придумать по крайней мере еще пару вещей здесь.

Итак, так просто, как говорит название:каков рекомендуемый тип данных для столбцов ID (первичный ключ) в базе данных?

EDIT: после получения нескольких коротких ответов я также должен добавить этот последующий вопрос. Без него ваш ответ не будет ни убедительным, ни поучительным... ;) почему вы так думаете, и каковы минусы другого варианта это делает вас не выбрать вместо этого?

8 ответов


любой целочисленный тип данных достаточного размера для хранения ожидаемых диапазонов данных. Обычно 32-битные int рассматриваются как слишком маленькие (правильно или неправильно) для таблиц с большим количеством строк или изменений. 64 бит int достаточно. Многие базы данных не будут иметь или не будут использовать этот целочисленный тип, но будут использовать числовой тип с заданным масштабом и точностью. 10-15 цифр-довольно распространенный размер.

причина выбора целочисленных типов двоякая:

  1. размер; и

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

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

плюсы для GUID:

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

плюсы для автоувеличение:

  • человечески понятно.
  • последовательное назначение означает, что вы можете использовать кластеризованный индекс и производительность воздействия.
  • подходит для разделения данных.

большим недостатком использования ключей GUID является то, что трудно выполнять "ad-hoc" запросы вручную. Иногда очень полезно, что вы можете сделать это:

выберите * от пользователя, где UserID=452245

с ключами GUID это может стать очень раздражающим.

Я бы рекомендовал 64-битные целые числа


скажите, какие критерии вы считаете важными.

Что это требуются должно быть уникальным в таблице.

идентификатор GUID является глобальным вероятностно-уникальным идентификатором. Он тоже большой. Если вам нужно, чтобы ваши индексы были уникальными для epsilon по сравнению с любой другой установкой базы данных во Вселенной, это хороший выбор. В противном случае, он использует много пространства без необходимости.

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

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


Если вы используете long, вы можете создать более 1000 в секунду и не запускать первичные ключи в течение 29 миллионов лет.

другие уже упоминали некоторые из преимуществ использования целочисленного типа вместо UUID / GUID. Одним из больших преимуществ является скорость и компактность индексов.

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


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

было бы неплохо, если базы данных может оказать поддержку inbuild для autoincrements с "префиксы". Поэтому в одной базе данных я получаю идентификаторы типа X1,X2, X3 ... и так далее, а в другая база данных это может быть Y1,Y2, Y3 ... и так далее.


Я задал аналогичный вопрос, который имеет несколько ответов, которые могут помочь. Репликация, по-видимому, является самым большим преимуществом использования GUID.

причины не использовать автоматически увеличивающийся номер для первичного ключа


следуйте совету Клетуса, с дополнительной оговоркой, что это во многом зависит от того, что ваш Стортинг. Никогда, никогда не используйте GUID. У GUID есть целый набор недостатков, и только один или два плюса.