Из моего опыта я узнал, что использование суррогатного столбца типа INT в качестве первичного ключа esp. ключевой столбец IDENTITY предлагает лучшую производительность, чем использование GUID или столбца типа данных char / varchar в качестве первичного ключа.
Я пытаюсь использовать ключ IDENTITY в качестве первичного ключа, где это возможно. Но недавно я наткнулся на схему, в которой таблицы были разделены по горизонтали и управлялись через разделенное представление. Поэтому в таблицах не может быть столбца IDENTITY, поскольку это сделает секционированное представление не подлежащим обновлению. Одним из способов решения этой проблемы было создание фиктивной таблицы 'keygenerator' с столбцом идентификаторов для генерации идентификаторов для первичного ключа. Но это будет означать наличие таблицы «keygenerator» для каждого секционированного представления.
Моей следующей мыслью было использовать 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
Но меня беспокоит вопрос о том, предлагают ли типы данных с плавающей точкой в качестве первичного ключа преимущества по сравнению с выбором GUID или char / varchar в качестве первичных ключей. Также важно то, что разбиение столбца с плавающей точкой будет частью составного ключа.