7

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

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

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

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

РЕДАКТИРОВАТЬ: После получения краткого ответа я также должен добавить этот следующий вопрос. Без этого ваш ответ не является ни убедительным, ни воспитывающим ...;) Почему вы так думаете, и каковы минусы другого варианта, который делает вас , а не.

+0

Следует отметить, что GUID и целое число являются просто различными способами отображения и генерации последовательности байтов. Где последовательно генерируются int, GUID генерируются «случайным образом» и в них больше байтов. это означает, что вам не нужно видеть существующее состояние базы данных для ее создания. все может быть нулевым в C# с? в теме. –

ответ

8

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

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

  1. Размер; и
  2. Скорость.

Размер целого числа является:

  • 32 бита: 4 байта;
  • 64 бит: 8 байт;
  • Двоичное кодированное десятичное число: две цифры на каждый байт плюс столько же, сколько байт для знака, шкалы и/или точности.

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

Сортировка целых чисел тривиальна и, если предположить, что они уникальны и диапазон достаточно мал, можно фактически сделать в O (n) времени по сравнению с, в лучшем случае, O (n log n).

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

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

+0

Спасибо за ваш ответ! См. Мое редактирование для последующего вопроса. –

1

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

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

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

+0

Спасибо за ваш ответ! См. Мое редактирование для последующего вопроса. –

5

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

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

Pros для GUID:

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

Pros для Autoincrement:

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

Недостаток использования ключей GUID состоит в том, что вручную выполнять «специальные» запросы сложно. Иногда это очень полезно, что вы можете сделать это:

SELECT * FROM пользователя, где UserID = 452245

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

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

+0

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

2

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

Что необходимо должно быть уникальным в пределах таблицы.

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

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

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

0

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

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

+0

И какой тип данных вы считаете своими X1 и Y2? Строки? В этом случае вам лучше использовать GUID ... – Jasper

0

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

Смежные вопросы