Из своего опыта я узнал, что использование столбца суррогатного типа данных INT в качестве первичного ключа особенно. столбец ключа IDENTITY обеспечивает лучшую производительность, чем использование столбца типа данных GUID или char / varchar в качестве первичного ключа. Я стараюсь использовать ключ IDENTITY в качестве первичного ключа везде, где это возможно. Но недавно я натолкнулся на схему, в которой таблицы были разделены по горизонтали и управлялись через разделенное представление. Таким образом, в таблицах не может быть столбца IDENTITY, поскольку это сделало бы разделенное представление необновляемым. Одним из способов решения этой проблемы было создание фиктивной таблицы «генератора ключей» со столбцом идентификаторов для генерации идентификаторов для первичного ключа. Но это означало бы наличие таблицы «генератора ключей» для каждого из секционированных представлений. Следующей моей мыслью было использовать float в качестве первичного ключа. Причина в следующем ключевом алгоритме, который я разработал.
DECLARE @KEY FLOAT
SET @KEY = CONVERT(FLOAT,GETDATE())/100000.0
SET @KEY = @EMP_ID + @KEY
Heres how it works.
CONVERT(FLOAT,GETDATE())
дает представление текущей даты и времени с плавающей запятой, поскольку внутренне все значения даты и времени представлены SQL как значение с плавающей запятой.
CONVERT(FLOAT,GETDATE())/100000.0
преобразует представление с плавающей запятой в полное десятичное значение, т.е. все цифры помещаются в правую часть ".".
@KEY = @EMP_ID + @KEY
добавляет идентификатор сотрудника, который является целым числом, к этому десятичному значению.
Логика заключается в том, что идентификатор сотрудника гарантированно будет уникальным для всех сеансов, поскольку сотрудник не может подключаться к приложению более одного раза одновременно. И для одного и того же сотрудника каждый раз, когда будет генерироваться ключ, текущая дата и время будет уникальной.
В целом уникальный ключ для всех сессий сотрудников и во времени.
Итак, для идентификаторов Emp Ids 11 и 12 у меня есть ключевые значения, такие как 12.40046693321566357, 11.40046693542361111
Но меня беспокоит, предлагает ли тип данных float в качестве первичного ключа преимущества по сравнению с выбором GUID или char / varchar в качестве первичных ключей. Также важно то, что разделение столбца с плавающей запятой будет частью составного ключа.