我们将文档存储在我们的数据库(sql server)中,文档分布在各个表中,因此没有一张表包含所有这些。
我现在需要为所有文档提供一个系统范围的唯一 ID,它是半可读的,不像 guid。
我以前通过创建一个具有单行/列的表来完成此操作,其中只有一个在创建新文档时会递增的数字。
这是最好的方法吗,如果有人要更新,我如何确保没有人读取当前号码,反之亦然?
在这种情况下,数字可以是 001 和根据需要自动递增,我主要担心停止碰撞而不是获得一个花哨的标识符。
我们将文档存储在我们的数据库(sql server)中,文档分布在各个表中,因此没有一张表包含所有这些。
我现在需要为所有文档提供一个系统范围的唯一 ID,它是半可读的,不像 guid。
我以前通过创建一个具有单行/列的表来完成此操作,其中只有一个在创建新文档时会递增的数字。
这是最好的方法吗,如果有人要更新,我如何确保没有人读取当前号码,反之亦然?
在这种情况下,数字可以是 001 和根据需要自动递增,我主要担心停止碰撞而不是获得一个花哨的标识符。
如果您想要单行/列方法,我使用过:
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)
为此,您可以使用 Redis。看看这篇文章:http ://rediscookbook.org/create_unique_ids.html
Redis 是一种非常快速的内存 NoSQL 数据库,但具有持久性功能。您可以快速利用 Redis 实例并使用它来创建唯一的增量编号。
然后,您可以在应用程序中将 Redis 用于其他多种用途。
另一个不涉及安装 Redis 的查询建议是按照您的建议使用单个数据库行/列,同时将其封装在事务中。这样你就不会遇到冲突。
一种“经典”方法确实是拥有一个单独的表(例如Documents
),其中(至少)一个 ID 列(int identity
)。然后,将外键列和约束添加到所有现有文档表。这确保了文档 ID 在所有表中的唯一性。
像这样的东西:
CREATE TABLE Documents (Id int identity not null)
ALTER TABLE DocumentTypeOne
ADD CONSTRAINT (DocumentId) DocumentTypeOne_Documents_FK Documents(Id)