首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >SQL Server中的相关ID

SQL Server中的相关ID
EN

Stack Overflow用户
提问于 2014-06-04 19:49:09
回答 2查看 2.8K关注 0票数 0

我想在我现有的Server 2012数据库中的许多表中添加一个CorrelationId列。

CorrelationId是一个标识符,它指示实体之间的关系,而不进一步描述这种关系。通常这将意味着记录是在同一个事务中创建的,或者以某种方式与相同的工作流相关。关联id也跨边界使用。因此,它将在其他系统中用于与同一工作流相关联。一个新的关联id应该是跨边界的全局唯一的。这不是用来替换外键的。这是一个比外键描述的更松散的关系。如果你愿意的话,这更像是一种暂时的关系。

不管是谁。我正在考虑如何发布这些CorrelationIds。一种方法是只使用GUID。但我也希望能够对它们进行索引。

另一种方法可以是创建一个CorrelationId池,它本质上是一个具有单个行和一个大INT列的表。这个号码应该是下一个可用的号码,当我请求这个号码时,它会增加计数器。如果我想确保在请求数字时没有种族条件,那么对此的查询会是什么样子的。

关联in应该是“免费的”,因为您只需要一个,它就会分发出去,再也不能使用了。如果您决定不使用它(例如,如果一个事务被回滚了),您可以直接扔掉它,而不必担心它再也不能被使用了。

即使CorrelationId不被视为外键,它也将用于在需要时连接查询中的表。由于这个原因,我想我更喜欢BigInt,所以如果我需要它,我可以创建索引。

你的建议是什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-06-04 20:03:27

好的,您基本上是在问如何创建bigint (ala标识列,但跨多个表共享)。

有许多可行的方法,最好的方法取决于你如何使用它。最近的SQL 2012中添加的序列特性可能是有用的,尤指。如果您习惯于Oracle生成器等。

如果有许多可能的调用者,则所有获取单个(或少数)值的值都会遇到严重的锁/资源争用。但是,如果可以在调用方中至少保持最小状态,那么下面的策略是非常有用的。

创建一个ID“块分配”存储的proc。您可以在请求的块中传递id的数目。调用方比只进行非常罕见的分配的调用者可以使用块大小为1进行分配,使用频繁的调用方可以使用单个调用分配1000 (或更多)。

添加--样本proc --未测试

代码语言:javascript
运行
复制
create table SharedID
(
    ID bigint not null
)

create proc GetBlock(@BlockSize int) as
begin

declare @dummy table
(
   ID bigint
)

UPDATE SharedID
SET ID = ID + @blocksize
OUTPUT INSERT.ID
into @dummy

-- or put into output parm if you prefer
select @dummy - @blocksize as IDBlockStart

end

如果分配的块为1000,那么在再次调用存储的proc分配器之前,您可以在内部满足来自该块的1000个调用。如果您编程崩溃,等等,您所丢失的就是在该块中分配的“未使用的”in。

此外,如果所有调用方都被有效地分配为1000块,只需使用增量为1000的序列来分配ID块。

票数 0
EN

Stack Overflow用户

发布于 2014-06-04 20:42:17

我会用个盖德。您可以很好地在GUID上创建索引(尽管它们将比BIGINT列中的索引大。

GUID的另一个主要优点是它们可以由第三方系统生成,并且仍然由您的系统使用。如果您有一个从其中提取序列号的表,则无法支持来自其他系统的ID。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24046284

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档