EF 4.0 Guid или Int в качестве первичного ключа - PullRequest
8 голосов
/ 04 января 2011

Я реализую пользовательский ASPNetMembership, используя EF 4.0

Есть ли причина, по которой я должен использовать Guid в качестве первичного ключа в таблицах пользователей?

Насколько я знаю, Int как ПК на SQL Server более производительный, чем строки.

И Int проще итерировать. Кроме того, в целях безопасности, если мне нужно передать какой-либо int id где-нибудь, например, в URL, я могу как-то его зашифровать и передать как строку без проб.

Но если я хочу использовать автоматически сгенерированный Guid на стороне SQL Server с использованием EF 4.0, мне нужно сделать этот трюк http://leedumond.com/blog/using-a-guid-as-an-entitykey-in-entity-framework-4/

Я не вижу ни одного случая, почему я должен использовать Guid в качестве PK, может быть только один, если в системе будут миллионы и миллионы пользователей, но теоретически Guid может дублироваться когда-нибудь, не так ли?

В любом случае размер Int32 равен 2 147 483,647, что довольно много даже для очень-очень большой системы, но если этого числа все еще недостаточно, я могу использовать Int64, в этом случае у меня может быть 9 223 372,036,854,775.807 строк. В значительной степени, да?

С другой стороны, M $ использует Guids в качестве PK в своей реализации ASPNetMembership. [aspnetdb]. [aspnet_Users] -> PK UserId Тип уникальный идентификатор, Должны быть какие-то причины / объяснения, почему это сделали?!

Может быть, у кого-то есть какие-нибудь идеи / опыт по этому поводу?

Ответы [ 3 ]

21 голосов
/ 04 января 2011

Я бы согласился на 100% с вами - использование INT IDENTITY намного лучше!

Идентификаторы GUID могут показаться естественным выбором для вашего первичного ключа - и, если вам действительно необходимо, вы, вероятно, можете поспорить, чтобы использовать его для ОСНОВНОГО КЛЮЧА таблицы. Я бы настоятельно рекомендовал не делать , а использовать столбец GUID в качестве ключа кластеризации , что SQL Server делает по умолчанию, если вы не указали этого специально.

Вам действительно нужно держать в стороне две проблемы:

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

2) ключ кластеризации (столбец или столбцы, которые определяют «кластеризованный индекс» в таблице) - это физическая вещь, связанная с хранилищем, и здесь маленький, стабильный, постоянно растущий тип данных - ваш лучший выбор - INT или BIGINT в качестве варианта по умолчанию.

По умолчанию первичный ключ в таблице SQL Server также используется в качестве ключа кластеризации, но это не обязательно должно быть именно так! Я лично наблюдал значительное увеличение производительности, когда разбивал предыдущий первичный / кластерный ключ на основе GUID на два отдельных ключа - первичный (логический) ключ на GUID и ключ кластеризации (упорядочения) на отдельном INT IDENTITY (1, 1) столбец.

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

Да, я знаю - в SQL Server 2005 и более поздних версиях newsequentialid() - но даже это не является действительно и полностью последовательным и, следовательно, также страдает от тех же проблем, что и GUID - только чуть менее заметно.

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

Быстрый расчет - использование INT и GUID в качестве первичного ключа и ключа кластеризации:

  • Базовая таблица с 1 000 000 строк (3,8 МБ против 15,26 МБ)
  • 6 некластеризованных индексов (22,89 МБ против 91,55 МБ)

ИТОГО: 25 МБ против 106 МБ - и это только на одном столе!

Еще немного пищи для размышлений - отличные вещи Кимберли Триппа - прочитайте это, прочитайте это снова, переварите это! Это на самом деле индексное Евангелие SQL Server.

3 голосов
/ 04 января 2011

Перейти с INT PK.См. Статью Кимберли Л. Триппа: GUID как ПЕРВИЧНЫЕ КЛЮЧИ и / или ключ кластеризации

2 голосов
/ 04 января 2011

До тех пор, пока Entity Framework не представит какую-либо концепцию пакетирования, нет причин не использовать INT IDENTITY. Guid полезен только тогда, когда вы хотите установить Id новой записи на клиенте.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...