[英]Deterministic Surrogate Key
我有一个带有整数标识列的表作为其他两个列(int 和 datetime)的代理键。 为了让这个键的值在测试和生产环境中保持同步,我想制作一个触发器,将代理键设置为某个确定性的值而不是自动生成的身份(在这种情况下是自然键的散列) . 据我所知,权衡是我引入了冲突的风险(可以通过将代理列更改为 bigint 来抵消)。
CREATE TRIGGER dbo.TRG_TestTable_SetID ON dbo.TestTable
INSTEAD OF INSERT
AS
BEGIN
insert into dbo.TestTable (ID, IntKey, DateKey, MoreData)
select convert(bigint, hashbytes('md5', convert(binary(4), IntKey) + convert(binary(8), DateKey))),
IntKey, DateKey, MoreData
from inserted
END
从设计的角度来看,这是一个很好的解决方案吗? 它仍然会比使用自然组合键作为主键表现更好吗?
编辑:自然键中的 int 是另一个表的外键,它是 guid 和 varchar 的代理键。 因此,该表上的“自然键”替代方案将是 guid、varchar 和 datetime 的相当丑陋的组合。
出于类似的原因,我之前使用过类似的技术并取得了很好的成功。 为了获得您想要的确定性质量,您可以尝试将复合自然键列值强制转换为字符串,将它们字符串连接在一起,然后从中生成一个 MD5 哈希值以用作您的确定性主键。
一些考虑:
优点
缺点
(抱歉有任何错别字和语法错误。我正在手机上写这个。我会尝试稍后回来清理它。)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.