Sql 多租户主键的最佳方法

Sql 多租户主键的最佳方法,sql,primary-key,multi-tenant,Sql,Primary Key,Multi Tenant,我有一个数据库供几个客户使用。我真的不希望代理增量键值在客户端之间溢出。我希望编号从1开始,并且是特定于客户的 我将使用由租户id和增量id组成的两部分组合键 为每个租户创建增量密钥的最佳方法是什么 我正在使用SQLServerAzure。我关心的是锁定表、重复键等。我通常会将主键设置为IDENTITY,然后继续 谢谢您是否计划将来使用SQL Azure联合体?如果是,当前版本的SQL Azure Federations不支持将标识用作聚集索引的一部分。有关更多详细信息,请参见此 如果您还没有研

我有一个数据库供几个客户使用。我真的不希望代理增量键值在客户端之间溢出。我希望编号从1开始,并且是特定于客户的

我将使用由
租户id
和增量id组成的两部分组合键

为每个租户创建增量密钥的最佳方法是什么

我正在使用SQLServerAzure。我关心的是锁定表、重复键等。我通常会将主键设置为IDENTITY,然后继续


谢谢

您是否计划将来使用SQL Azure联合体?如果是,当前版本的SQL Azure Federations不支持将标识用作聚集索引的一部分。有关更多详细信息,请参见此

如果您还没有研究过联合体,您可能会想查看它,因为它提供了一种有趣的方法,既可以分割数据库,也可以隔离数据库中的租户

根据您的最终目标,使用联合,您可能能够使用GUID作为表上的主聚集索引,并且还可以在表上使用增量INT-IDENTITY字段。可以向最终用户显示此INT-IDENTITY字段。如果您在TenantID上进行联合,则每个“租户表”实际上都会成为一个思洛存储器(至少据我所知),因此在该表中的字段上使用标识实际上是一个不断增加的自动生成值,在给定租户中会不断增加


当\如果数据合并在一起(合并来自多个租户的数据),您将在该INT-IDENTITY字段上发生冲突(因此,联合体中不支持将IDENTITY作为主键)但是,只要您不将此字段用作整个系统中的唯一标识符,您就可以了。

如果您希望复制插入时自动分配唯一INT键的便利性,您可以添加一个
而不是INSERT
触发器,该触发器使用现有列的MAX+1来确定下一个值

如果具有标识值的列是索引中的第一个键,那么MAX查询将是一个简单的索引查找,非常有效

事务将确保分配唯一的值,但这种方法与标准标识列具有不同的锁定语义。IIRC,SQL Server可以为并行请求它的每个事务分配不同的标识值,如果事务回滚,则会丢弃分配给它的值。MAX方法一次只允许一个事务向表中插入行

一种相关的方法是使用一个由表名、租户ID和当前标识值组成的专用键值表。它需要相同的
而不是INSERT
触发器和更多的样板文件来查询并保持键表的更新。但这不会改善并行操作;锁只会出现在另一张表的记录上

修复锁定瓶颈的一种可能性是将当前SPID包括在密钥的值中(现在标识密钥是顺序int和分配它的任何SPID的组合,而不是简单的顺序),使用专用标识值表并根据需要在每个SPID中插入记录;标识表PK应该是(表名、租户、SPID),并且有一个具有当前顺序值的非键列。这样,每个SPID都会有自己的动态分配标识池,并且只会锁定自己的特定于SPID的记录


另一个缺点是维护触发器,每当您更改任何特殊标识表中的列时,这些触发器都必须更新。

“我真的不希望代理增量键值在客户端之间溢出…”我很好奇,为什么您不希望发生这种情况?主要是因为它会让人们知道我正在处理多少行,在我的乌托邦世界中,它们应该被完全隔离开来。事实上,你可以同时拥有引用完整性的代理主键(对客户隐藏)和两列唯一索引,例如:(Cust_id,Order_Number)非常正确。我会再考虑一下。不确定是否感觉完全正确,但肯定是一个想法。谢谢你也可以使用a/键,键后面没有任何隐含的含义。