我有一个数据库被多个客户使用。我不想让代理增量键值在客户之间混淆。我希望编号从1开始,且是特定于客户的。
我将使用tenant_id
和递增id的两部分组成的复合键。
创建每个租户的递增键的最佳方法是什么?
我正在使用SQL Server Azure。我担心锁定表、重复键等问题。通常我会将主键设置为IDENTITY并继续进行。
谢谢
我有一个数据库被多个客户使用。我不想让代理增量键值在客户之间混淆。我希望编号从1开始,且是特定于客户的。
我将使用tenant_id
和递增id的两部分组成的复合键。
创建每个租户的递增键的最佳方法是什么?
我正在使用SQL Server Azure。我担心锁定表、重复键等问题。通常我会将主键设置为IDENTITY并继续进行。
谢谢
如果您想要复制在插入时自动分配唯一INT键的便利性,可以添加一个INSTEAD OF INSERT
触发器,该触发器使用现有列的MAX值+1来确定下一个值。
如果具有标识值的列是索引中的第一个键,则MAX查询将是简单的索引查找,非常高效。
事务将确保分配唯一值,但此方法将具有与标准标识列不同的锁定语义。如果我没记错的话,SQL Server可以为每个并行请求它的事务分配不同的标识值,如果事务回滚,则分配给它的值将被丢弃。 MAX方法只允许一个事务同时向表中插入行。
相关方法可能是拥有一个专用的键值表,由表名、租户ID和当前标识值组成。它将需要相同的INSTEAD OF INSERT
触发器以及更多的样板文件来查询和更新该关键表。它不会改善并行操作;锁定只是在不同表的记录上。
解决锁定瓶颈的一种可能性是在键的值中包含当前的 SPID(现在身份标识键是顺序 int 和任何分配它的 SPID 的组合,而不仅仅是顺序),使用专用的身份值表,并根据需要在其中插入每个 SPID 的记录;身份表的主键将是(表名、租户、SPID),并具有当前顺序值的非键列。这样,每个 SPID 将拥有自己动态分配的身份池,并且只会锁定自己的 SPID 特定记录。
另一个缺点是维护触发器,必须在更改任何特殊身份表的列时进行更新。