2012-10-02 72 views
0

我们将文档存储在我们的数据库(sql server)中,文档遍布各种表,因此没有一个表包含所有这些表。生成一个可靠的全系统唯一标识符

我现在有一个要求,即为所有文档提供一个系统范围的唯一ID,一个半可读的文档,而不是一个GUID。

我以前见过这个做法是通过创建一个具有单行/列的表来创建新文档时增加的数字。

这是最好的方式去做,如何确保没有人读取当前的数字,如果有人要更新,反之亦然?

在这种情况下,数字可以像001一样,并根据需要自动递增,我主要担心停止冲突而不是获得一个奇特的标识符。

+0

为什么没有在一个表中的所有文件? – Random832

+0

它现有的系统,他们不存在,再加上他们有不同的数据存储对他们,不适用于所有文件类型 –

回答

2

如果你想在单行/列的方式,我用:

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

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


表DEFN:

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

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

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

然后,您可以在应用程序中将Redis用于其他许多用途。

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

+0

看起来很有趣,不知道如果我想要去那么远,只是为了得到一个独特的数字系统 - 全部 –

+1

如果事务需要很长时间,是否有人可以获得当前索引,然后当事务完成时用重复值覆盖它 –

+0

否,您应该读取当前索引,并添加1(或者这样),编写它,然后将该编号用于新生成的记录。所有这些都应该在交易中完成。如果另一个进程试图读取当前索引,那么它也将在一个事务中,并且在第一个事务没有提交时(记录将被锁定),它将不能读取该数字。 –

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)