我想在我现有的Server 2012数据库中的许多表中添加一个CorrelationId列。
CorrelationId是一个标识符,它指示实体之间的关系,而不进一步描述这种关系。通常这将意味着记录是在同一个事务中创建的,或者以某种方式与相同的工作流相关。关联id也跨边界使用。因此,它将在其他系统中用于与同一工作流相关联。一个新的关联id应该是跨边界的全局唯一的。这不是用来替换外键的。这是一个比外键描述的更松散的关系。如果你愿意的话,这更像是一种暂时的关系。
不管是谁。我正在考虑如何发布这些CorrelationIds。一种方法是只使用GUID。但我也希望能够对它们进行索引。
另一种方法可以是创建一个CorrelationId池,它本质上是一个具有单个行和一个大INT列的表。这个号码应该是下一个可用的号码,当我请求这个号码时,它会增加计数器。如果我想确保在请求数字时没有种族条件,那么对此的查询会是什么样子的。
关联in应该是“免费的”,因为您只需要一个,它就会分发出去,再也不能使用了。如果您决定不使用它(例如,如果一个事务被回滚了),您可以直接扔掉它,而不必担心它再也不能被使用了。
即使CorrelationId不被视为外键,它也将用于在需要时连接查询中的表。由于这个原因,我想我更喜欢BigInt,所以如果我需要它,我可以创建索引。
你的建议是什么?
发布于 2014-06-04 20:03:27
好的,您基本上是在问如何创建bigint (ala标识列,但跨多个表共享)。
有许多可行的方法,最好的方法取决于你如何使用它。最近的SQL 2012中添加的序列特性可能是有用的,尤指。如果您习惯于Oracle生成器等。
如果有许多可能的调用者,则所有获取单个(或少数)值的值都会遇到严重的锁/资源争用。但是,如果可以在调用方中至少保持最小状态,那么下面的策略是非常有用的。
创建一个ID“块分配”存储的proc。您可以在请求的块中传递id的数目。调用方比只进行非常罕见的分配的调用者可以使用块大小为1进行分配,使用频繁的调用方可以使用单个调用分配1000 (或更多)。
添加--样本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个调用。如果您编程崩溃,等等,您所丢失的就是在该块中分配的“未使用的”in。
此外,如果所有调用方都被有效地分配为1000块,只需使用增量为1000的序列来分配ID块。
发布于 2014-06-04 20:42:17
我会用个盖德。您可以很好地在GUID上创建索引(尽管它们将比BIGINT列中的索引大。
GUID的另一个主要优点是它们可以由第三方系统生成,并且仍然由您的系统使用。如果您有一个从其中提取序列号的表,则无法支持来自其他系统的ID。
https://stackoverflow.com/questions/24046284
复制相似问题