C# 为不同实体生成序列
在我们的应用程序中,我们有不同的项目类型,例如A、B、C、D 用户可以为每种类型创建一个项目,每个项目都必须有自己的序列号C# 为不同实体生成序列,c#,sql-server,C#,Sql Server,在我们的应用程序中,我们有不同的项目类型,例如A、B、C、D 用户可以为每种类型创建一个项目,每个项目都必须有自己的序列号 A-1 // the next item will have number as 2 B-2 // the next item will have number as 3 C-1 D-1 解决方案-1 我可以创建一个单独的表,存储每个itemtype的序列号 从该表中获取最新值,使用它,将其递增1,然后更新该表 如果我们不在代码中实现任何锁定机制,这个解决方案可能会导致
A-1 // the next item will have number as 2
B-2 // the next item will have number as 3
C-1
D-1
解决方案-1
- 我可以创建一个单独的表,存储每个itemtype的序列号
- 从该表中获取最新值,使用它,将其递增1,然后更新该表
- 如果我们不在代码中实现任何锁定机制,这个解决方案可能会导致两个项目具有相同的编号
- 对于每种项目类型,我们在DB中定义一个序列
- 使用的下一个值获取下一个序列号
- 在这种方法中,我们不必在代码中执行任何锁定机制
请建议应该采取什么方法,或者有没有更好的方法来实现它。如果您的项目类型没有扩展,那么我会选择解决方案2,但如果您希望它增长,那么请使用创建触发器增强解决方案1。。。对于INSERT,我也遇到了同样的问题,我从解决方案1开始,但最终还是使用了解决方案2,以避免由防止重复所需的锁引起的死锁 您可以定义一个简单的存储过程来管理自定义序列。它将在必要时创建一个新序列,并返回对应序列的下一个值
CREATE PROCEDURE [dbo].[CUSTOM_SEQUENCES_NewValue]
@TYPE nvarchar(32),
@VALUE int out
AS
declare @SEQUENCE nvarchar(64);
declare @SQL nvarchar(128);
BEGIN
set @SEQUENCE = N'SEQ_CUSTOM_SEQUENCE_' + @TYPE
if not exists(select * from sys.sequences where name = @SEQUENCE)
begin
set @SQL = N'create sequence dbo.' + @SEQUENCE + ' as bigint start with 1';
execute sp_executesql @SQL;
end
set @SQL = N'set @VALUE = next value for dbo.' + @SEQUENCE;
exec sp_executesql @SQL, N'@VALUE int out', @VALUE = @VALUE out;
END
你已经回答了。您有不同的项目类型,因此每个A、B、C和D都有不同的表。然后每个项目都有自己的ID,在本例中为int,您可以得到您想要的。您能容忍数字上的差距吗?我的意思是,如果你有
A-1
和A-3
但没有A-2
,那对你来说是“交易破坏者”,还是只要你有升序的数字就可以了?我现在还不打算重复你的问题,但我想我们怎么知道这些数字对你意味着什么?我们不知道你在想什么“独一无二!,只是数字还是数字加上它的类型?两者都是可能和有效的。适合你的场景只有你自己知道。这就是为什么我投票以opinion.based结束这个问题。你们能不能不使用SQL表来处理ID生成?这看起来简单多了……这实际上是一个很好的解决方案。但是,请注意,如果同一类型的数字之间的潜在差距是一个问题,那么我建议的解决方案(在答案注释的链接中)仍然比这个更好。另外,通常生成数据库对象应该是设计时操作,而不是运行时操作。尽管如此,我认为这个答案仍然值得一个+1。