Нет ничего плохого в использовании GUID в качестве первичного ключа. Конечно, они могут иметь некоторые недостатки, если не используются должным образом, но рассмотрим сценарий, в котором у вас есть различные базы данных в магазинах или других точках продаж, и каждую ночь вам нужно брать все данные из каждого местоположения и объединять их в один мастер базы данных на корпоратив. GUID - отличный вариант, потому что вам не нужно беспокоиться о конфликтах личных данных.
Каждый из них сказал мне держаться подальше от GUIDS в качестве первичных ключей при создании базы данных ... потому что первичный ключ - это кластеризованный индекс!
Первичный ключ не должен использовать кластеризованный индекс, это просто тип индекса по умолчанию, используемый при создании первичного ключа.
Фактически, если вы посмотрите на схему базы данных, используемую SqlMembershipProvider
, то увидите, что в столбце первичного ключа есть некластеризованный индекс.
Ниже приведен сценарий SQL из сценария InstallCommon.sql
в %WINDIR%\Microsoft.NET\Framework\v4.0.30319
:
CREATE TABLE [dbo].aspnet_Users (
ApplicationId uniqueidentifier NOT NULL FOREIGN KEY REFERENCES [dbo].aspnet_Applications(ApplicationId),
UserId uniqueidentifier NOT NULL PRIMARY KEY NONCLUSTERED DEFAULT NEWID(),
UserName nvarchar(256) NOT NULL,
LoweredUserName nvarchar(256) NOT NULL,
MobileAlias nvarchar(16) DEFAULT NULL,
IsAnonymous bit NOT NULL DEFAULT 0,
LastActivityDate DATETIME NOT NULL)
CREATE UNIQUE CLUSTERED INDEX aspnet_Users_Index ON [dbo].aspnet_Users(ApplicationId, LoweredUserName)
CREATE NONCLUSTERED INDEX aspnet_Users_Index2 ON [dbo].aspnet_Users(ApplicationId, LastActivityDate)
Обратите внимание, что столбец первичного ключа (UserId
) создается с помощью оператора PRIMARY KEY NONCLUSTERED
и что индекс CLUSTERED
таблицы создается как составной индекс для ApplicationId
и LoweredUserName
.