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

Почему ASP.NET Identity 2.0 использует GUID/string как идентификатор пользователя?

Как гласит название, интересно, почему ASP.NET Identity 2.0 использует строку с GUID как основной кластеризованный ключ для таблицы пользователя. Имеет ли это какие-либо преимущества для целочисленного идентификатора? Я вижу только проблему, что GUID не лучший выбор для кластерного индекса.

Я пропустил что-нибудь или целое число еще лучше?

4b9b3361

Ответ 1

Что касается использования guid, то существует точка зрения, которая способствует использованию идентификаторов без "значения", чтобы полностью отделить идентификатор от окружающих его данных; этот идентификатор не должен быть видимым из-за пределов хранилища данных. Если мы рассмотрим некоторые характеристики суррогатного ключа, мы имеем следующие

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

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


Что касается производительности, я бы указал вам на этот поток, где в принятом ответе говорится:

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

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

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

которые полностью подтверждают ваше впечатление.

Ответ 2

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

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

Ответ 3

Я предполагаю, что под "id" вы подразумеваете последовательный интегральный идентификатор, поскольку UUID - это, в конце концов, идентификатор.

Если абсолютно никто не использует Identity 2.0 или будущую версию, когда-либо хотел объединиться или объединить несколько хранилищ или когда-либо импортировать пользователей и/или роли, тогда будет работать числовой идентификатор.

Если только несколько человек делают или даже могут, то UUID делает больше смысла.

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

В целом, UUID представляется очевидным выбором.

Ответ 4

A Guid как UserId (таким образом, первичный ключ) может быть вашим лучшим другом в разы.

Что-то, что следует учитывать, когда люди "разглагольствуют" против GUID, могут не рассматривать "случайно связанные" приложения, в результате чего вы не можете попасть в базу данных, чтобы получить значение поля "int", пока вы не восстановите соединение, но вам нужно создать несколько записи в разных таблицах, связанных друг с другом в автономном режиме. Наличие Guid позволяет приложению создавать "пользователь" и, следовательно, "userId" в качестве первичного ключа без коллизий при синхронизации в режиме онлайн.

Чтобы избежать сбоев производительности, не помещайте Guid в индекс кластера. Вы всегда можете использовать другое уникальное поле в качестве идентификатора кластера или, возможно, даже использовать целое поле идентификатора, увеличенное на единицу как "clusterId" и использовать его вместо этого.

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

Ответ 5

Как обычно, Microsoft думает о "простоте" скорее, чем о том, чтобы быть действительно полезным и результативным. Да GUID уникален в системе, да, вы можете протестировать его, не смывая новый идентификатор из базы данных.... НО...

Я даже не собираюсь обсуждать индексы DB, о которых, я уверен, многие думали. Вот еще один недостаток строк. Даже если я использую BIGINT в db как userid, он по-прежнему остается только 8 байтов против varchar (128). Я понимаю, что дисковое пространство в наши дни дешево, но почему я должен загромождать свой db ненужными вещами. Любой, кто когда-либо работал над любым проектом, в котором задействованы миллионы пользователей, будет недооценивать строки как их идентификатор пользователя. Все ответы от Microsoft относительно "почему они использовали строки" в основном отбрасывают ответы.

Конечно, они скажут: "вы можете изменить его на использование INTs, BIGINT и т.д.". Конечно, вам нужно изменить множество классов, реализовать свой собственный магазин пользователей и т.д. Правильно... что-то настолько простое быть настолько сложным.

/end rant