复合可分解唯一键

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 - 我们不知道您的数据库使用情况(插入/更新/删除率),但我建议您对使用VARCHARINTEGER 解决方案进行一些性能测试。请放心,VARCHAR 解决方案变慢,但我怀疑它会成为您应用程序的性能杀手。

以上是关于复合可分解唯一键的主要内容,如果未能解决你的问题,请参考以下文章

教义和复合唯一键

SQL Server + 复合键或唯一 ID

如何使复合键唯一?

使用 Laravel 的 foreignIdFor 方法并创建复合唯一键

如何在 mongoDB 中创建复合唯一键

jpa 复合主键并可与唯一键连接