0

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

我现在需要为所有文档提供一个系统范围的唯一 ID,它是半可读的,不像 guid。

我以前通过创建一个具有单行/列的表来完成此操作,其中只有一个在创建新文档时会递增的数字。

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

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

4

3 回答 3

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)
于 2012-10-02T06:41:45.013 回答
1

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

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

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

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

于 2012-10-02T04:55:01.263 回答
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)
于 2012-10-02T06:05:41.947 回答