SQL Server中的关联ID

时间:2014-06-04 19:49:10

标签: sql-server database guid

我想将CorrelationId列添加到现有SQL Server 2012数据库中的许多表中。

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

Anywho。我正在考虑如何发布这些CorrelationIds。一种方法是只使用GUID。但我希望能够为它们编制索引。

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

相关ID应该是“免费”的,因为你只需要一个,然后分发,永远不能再使用。如果您决定不使用它(例如,如果事务被回滚),您可以将其丢弃,并且不必担心它永远不能再次使用。

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

您的建议是什么?

2 个答案:

答案 0 :(得分:2)

我会使用GUID。你可以在GUID上创建索引就好了(虽然它们会比在BIGINT列上大。

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

答案 1 :(得分:0)

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

有许多可行的方法,最好的方法取决于你如何使用它。最近的sequence feature added in SQL 2012可能很有用,尤其是如果你习惯了Oracle生成器等等。

如果您有许多可能的呼叫者,则所有抓取单个(或少数)个值的数据都会导致严重的锁定/资源争用。但是,如果您可以在调用者中保持至少最小状态,则以下策略非常有用。

制作ID"块分配"存储过程。您可以在请求的块中传入id的数量。调用者只能进行非常罕见的分配,可以使用1的块大小进行分配,大量使用调用者可以通过一次调用分配1000(或更多)。

ADDED - 示例proc - 未经过测试

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个调用。如果您对崩溃等进行编程,那么您丢失的就是"未使用的"在该区块中分配的ID。

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