DB中的表用于生成主键?

Den*_*dic 7 database sql-server database-design poeaa

您是否曾使用单独的表来"生成"DB的人工主键(以及为什么)?我的意思是拥有一个包含两列,表名和当前ID的表 - 通过简单地用该表名锁定行,获取键的当前值,增加它,您可以使用该表为某些表获取新的"ID"一个,解锁行.为什么您更喜欢这个超过标准整数标识列?

PS"想法"来自Fowlers模式的企业应用程序架构,顺便说一下......

Wil*_*ler 10

这称为Hi/Lo分配.

你可以这样做,你的表上的INSERT触发器从这个表中获取ID,并在你获得你的ID之前或之后递增它,具体取决于你的选择.

当您必须处理多个数据库引擎时,通常会使用此方法.Oracle中的自动增量标识符是通过SEQUENCE进行的,您可以在数据表的BEFORE INSERT TRIGGER中使用SEQUENCE.NEXTVALUE进行增量.

相反,SQL Server具有IDENTITY列,本机自动增量,这由DBE本身管理.

为了使您的软件能够在两个DBE上工作,您必须达到某种标准,然后用于此的最常见的"标准"是对主键的Hi/Lo分配.

这是一种方法.目前,使用NHM的ORM Mapping工具,它通过配置提供,因此您需要更少的关注应用程序和数据库方面.

编辑#1

由于这种操作不能用于全局范围,因此每个数据库或数据库模式都必须有这样的表.这样,每个模式都与另一个模式无关.但是,一个模式中的数据不能使用相同的密钥隐式地移向另一个模式,因为它可能与已存在的行冲突.

对于安全模式,它访问与另一个模式或用户相同的数据库,因此特定安全模式不应存在其他表.


Joe*_*orn 5

每当你可以使用sql server的身份或guid功能时,你应该.但是,有一些情况可能无法做到这一点.

一个例子是sql server只允许每个表一个标识列.很少,表会有需要私有id和公共id的记录,并且一个标识列的限制意味着生成两者作为整数可能是一种痛苦.你总是可以使用一个guid,但你想要私有id上的整数来提高速度,你可能也希望公共id比guid更具人性化.

在这种情况下,用于生成id的额外表格是有意义的.但是,我的做法有点不同.表中仍有两列,但为每个真实表制作一个"阴影"或"Id映射"表.其中一列将是您的私人ID(唯一约束),其中一个将是您的公共ID(可能是增量值为'7'或​​'13'的身份或其他不比'1'明显的数字).

这里的关键区别是你不想自己做锁定.让sql server处理它.