复合可分解唯一键
Posted
技术标签:
【中文标题】复合可分解唯一键【英文标题】:Composite Decomposible Unique Key 【发布时间】:2011-11-24 20:21:45 【问题描述】:我有一堆要加入到视图中的表。我需要视图中的每个结果行都有一个唯一的 id...不一定是 guid,而是一些可以唯一标识每一行的值...此外,可以分解为用于构造的相应主键独特的价值。
起初我使用的是这里建议的公式: Formula for Unique Hash from Integer Pair
...效果很好,但是现在我遇到了 Id 可能在整数地址空间之外运行的问题...甚至可能(稍微)在 bigint 地址空间之外运行。
有人可以就如何解决这个问题提供建议(也许通过创建复合 guid 而不是数值)?
【问题讨论】:
为什么要费力地将多个键合并为一个呢?您不能将每个表的主键作为单独的列添加到视图中吗? 这些的组合将是独一无二的,您不必担心溢出或计算。 一个很好的观点......但不幸的是,由于我们的 ORM 的限制,这是不可能的 出于兴趣,哪个ORM?也许您可以发布答案here ;) 【参考方案1】:这听起来太简单了,但您是否考虑过创建一个由各种主键组成的 varchar 字段,可能由一些分隔符分隔?
select
cast(tableA.id as varchar) + '-' +
cast(tableB.id as varchar) + '-' +
cast(tableC.id as varchar) as compositeKey,
tableA.foo //etc...
【讨论】:
+1 也许不是性能最好的解决方案,但我想到了。这很容易实现。 是的,易于实现……但我想让它在搜索方面更具性能。我想在视图列上创建一个唯一的聚集索引。 @JeffN825 - 在 varchar 列上创建唯一聚集索引不是问题,但我想知道您将如何启动搜索(在 varchar 或整数列上)。 通过另一个视图中的 FK 列执行相同的计算。 @JeffN825 - 我们不知道您的数据库使用情况(插入/更新/删除率),但我建议您对使用VARCHAR
和INTEGER
解决方案进行一些性能测试。请放心,VARCHAR
解决方案会变慢,但我怀疑它会成为您应用程序的性能杀手。以上是关于复合可分解唯一键的主要内容,如果未能解决你的问题,请参考以下文章