生成可靠的系统范围唯一标识符

时间:2012-10-02 04:52:10

标签: sql-server uniqueidentifier

我们将文档存储在我们的数据库(sql server)中,文档分布在各个表中,因此没有一个表包含所有这些文档。

我现在要求为所有文档提供系统范围内唯一的id,一个半可读的,不像guid。

之前我已经看到过这种情况,只需创建一个单行/列的表,只有一个数字在创建新文档时会增加。

这是最好的解决方法吗?如果有人即将更新,我如何确保没有人读取当前号码,反之亦然?

在这种情况下,数字可以是001,并根据需要自动增加,我主要担心的是停止碰撞而不是获得花哨的标识符。

3 个答案:

答案 0 :(得分:2)

如果你想要单行/列方法,我用过:

declare @MyRef int
update CoreTable set @MyRef = LastRef = LastRef + 1

更新将是安全的 - 每个执行此更新的人都会在@MyRef中收到明显的结果。这比单独的读取,增量,更新更安全。


表格定义:

create table CoreTable (
    X char(1) not null,
    LastRef int not null,
    constraint PK_CoreTable PRIMARY KEY (X),
    constraint CK_CoreTable_X CHECK (X = 'X')
)
insert into CoreTable (X,LastRef) values ('X',0)

答案 1 :(得分:1)

您可以使用Redis。看看这篇文章:http://rediscookbook.org/create_unique_ids.html

Redis是一个非常快速的内存NoSQL数据库,但具有持久性功能。您可以快速使用Redis实例并使用它来创建唯一的增量数字。

然后,您可以在应用中将Redis用于其他目的。

您的查询不涉及安装Redis的另一个建议是使用您建议的单个数据库行/列,同时将其封装在事务中。这样你就不会遇到冲突。

答案 2 :(得分:1)

一种“经典”方法确实是拥有一个单独的表格(例如Documents),其中包含(至少)一个ID列(int identity)。然后,将外键列和约束添加到所有现有文档表。这确保了文档ID在所有表中的唯一性。

这样的事情:

CREATE TABLE Documents (Id int identity not null)


ALTER TABLE DocumentTypeOne 
ADD CONSTRAINT (DocumentId) DocumentTypeOne_Documents_FK Documents(Id)