【发布时间】:2009-08-23 12:27:48
【问题描述】:
根据我的经验,我了解到使用代理 INT 数据类型列作为主键 esp。与使用 GUID 或 char/varchar 数据类型列作为主键相比,IDENTITY 键列提供了更好的性能。 我尝试尽可能使用 IDENTITY 键作为主键。但最近我遇到了一种模式,其中表是水平分区的,并通过分区视图进行管理。所以表不能有 IDENTITY 列,因为这会使分区视图不可更新。解决此问题的一种方法是创建一个带有标识列的虚拟“keygenerator”表来生成主键的 ID。但这意味着每个分区视图都有一个“密钥生成器”表。 我的下一个想法是使用 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
将整数形式的员工 ID 添加到此十进制值中。
逻辑是确保员工 ID 在会话中是唯一的,因为员工不能同时多次连接到应用程序。对于同一员工,每次生成密钥时,当前日期时间都是唯一的。
所有员工会话和时间的唯一键。
所以对于 Emp Ids 11 和 12,我有像 12.40046693321566357、11.40046693542361111 这样的键值
但我担心,与选择 GUID 或 char/varchar 作为主键相比,浮点数据类型作为主键是否会带来好处。同样重要的是因为分区浮点列将成为复合键的一部分。
【问题讨论】:
标签: floating-point primary-key