【问题标题】:Auto generation of ID自动生成 ID
【发布时间】:2011-01-11 20:41:31
【问题描述】:
我需要用
以下特点:
ID 必须是唯一的
Id 由“类型”和“自动递增”编号两部分组成
'type' 是整数,值可以是 1、2 或 3
'自动递增'数字从 10001 开始,每次 id 递增
已生成。
类型是从 Web 表单和自动递增的数字中选择的
来自数据库。
示例:如果选择类型 2 并且自动递增的数字为 10001
那么生成的id就是=210001
可能有数百个用户生成 id。现在我的问题是,
这可以在没有存储过程的情况下完成,这样就没有 id 冲突。
我正在使用 ASP.Net(C#)、Oracle、NHibernate
【问题讨论】:
标签:
c#
asp.net
oracle
nhibernate
【解决方案1】:
当您使用 Oracle 时,您可以为此使用 Sequence。
每次拨打your_sequence.NEXTVAL,都会返回一个唯一号码。
【解决方案3】:
使用 ID 的第一个数字来定义类型有什么意义?您应该为此使用单独的列,然后只使用普通的自动递增主键作为实际 ID。
【解决方案4】:
最干净的方法是——正如 Scott Anderson 所说的——使用两列。每个属性都应该是原子的,即只有一个含义。对于多值列,您必须应用函数(substr)来显示类型。约束将更难定义。没有什么比简单的“check (integer_type in (1,2,3))”或“check (id > 10000)”更胜一筹了。
至于定义你的第二个属性——我们称之为“id”——从 10001 开始的数字,你有两个很好的策略:
1) 使用一个序列,从1开始,显示使用表达式“10000 + row_number() over (partition by integer_type order by id)”,让用户看到他们想要的数字。
2) 使用三个序列,每个 integer_type 一个,并让它们的 start with 子句为 10001。
您绝对应该使用序列的原因是可伸缩性。如果您不使用序列,则必须将当前值存储在某个表中,并序列化对该表的访问。这在多用户系统中并不好。使用序列,您可以设置缓存属性以减少几乎所有的争用问题。
希望这会有所帮助。
问候,
抢。
【解决方案5】:
如果您不能使用自动递增类型(例如序列),请创建一个包含每种类型并记录其当前值的表。小心控制对该表的访问并使用它来生成新数字。不过,它很可能会成为您数据库中的热点。