我们将文档存储在我们的数据库(sql server)中,文档分布在各个表中,因此没有一个表包含所有这些文档。
我现在要求为所有文档提供系统范围内唯一的id,一个半可读的,不像guid。
之前我已经看到过这种情况,只需创建一个单行/列的表,只有一个数字在创建新文档时会增加。
这是最好的解决方法吗?如果有人即将更新,我如何确保没有人读取当前号码,反之亦然?
在这种情况下,数字可以是001,并根据需要自动增加,我主要担心的是停止碰撞而不是获得花哨的标识符。
答案 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)