【问题标题】:Identity columns for multitenant database schemas多租户数据库模式的标识列
【发布时间】:2010-09-21 11:27:48
【问题描述】:

我正在创建一个多租户应用程序,其中一些表需要按顺序分配整数值。订购是针对每个租户独立完成的。作为一个具体的例子,考虑一个带有RegNumber 列的Student 表。 RegNumber 必须按顺序分配,但顺序是每个租户本地的。

我正在考虑的解决方案涉及使用另一个表来保存每个租户的“下一个可用”RegNumber 值,这让我提出了几个问题:

  1. 有没有更好的办法?
  2. 在单个事务中执行“SELECT FROM tenant_studentid_sequence”和“INSERT INTO students”的最佳方法是什么,而不需要过度锁定,并且不可能跳过或重复值?

在 MySQL 中,我可以使用 SELECT FOR UPDATE,但是 SQL Server 2008 呢?有不少讨论on this SO question,不过好像是基于SQL Server 2005。2008有什么变化吗?推荐的策略是什么?

编辑 1: 我想我应该澄清我所说的“独立地为每个租户”是什么意思。我正在寻找的是一种让每个租户拥有一组按顺序排列的学生 ID 的方法。也就是说,租户 A 将有 ID 为 1、2、3、... 的学生,租户 B 也将如此。将它们视为业务密钥。我有对客户隐藏的全局身份 GUID。

【问题讨论】:

  • 您是否有理由不能为此使用标识列?
  • 我已经编辑了这个问题,让事情变得更清楚一些。身份列不允许我为每个租户拥有独立的序列。我需要租户 A 和 B 拥有 ID 为 1、2、3、...的学生实例。
  • 这是一种需要推后的要求。为此创建一个好的解决方案是昂贵的,并且很难正确维护并且完全没用。为什么他们需要为每个客户提供相同的号码? 99.9% 的时间完全没有意义。这样做是浪费客户的钱。
  • @HLGEM:不是同一个客户端;该应用程序是多租户的。每个租户都需要有一个干净的学生 ID 序列。
  • 我们有多租户数据库并使用身份,数字应该没有意义,如果一个客户的 id 为 1100 而另一个客户的 id 为 1101 无关紧要。确实这是一个糟糕的要求,需要大量工作没有任何收获。

标签: sql-server transactions locking


【解决方案1】:

您是否试图保证RegNumber 在所有租户中都是唯一的?如果是这样,这就是我在类似情况下所做的。使用自动递增的IDENTITY 属性,使用seed 以个位标识每个租户,然后将increment 标识为10。

CREATE TABLE Student (
   RegNumber INT IDENTITY(1,10),
   ...
)

租户 1

IDENTITY(1,10) - 生成 ID:1, 11, 21, 31, ...

租户 2

IDENTITY(2,10) - 生成 ID:2, 12, 22, 32, ...

租户 3

IDENTITY(3,10) - 生成 ID:3, 13, 23, 33, ...

等等

这最多适用于 10 个租户。如果您需要超出此范围,只需根据需要通过增加 100(或 1000 或 10000...)来扩展此概念。

【讨论】:

  • 没有。事实上,我需要的恰恰相反。 RegNumber 在租户之间应该是可重复的。我刚刚更新了问题以澄清这一点。
  • 在这种情况下,为什么不直接使用 IDENTITY(1,1) 并完成它。
  • 我无法使用 IDENTITY,因为该应用是多租户的。 student 表将保存不同租户的学生记录。无论哪个租户插入记录,IDENTITY 不会一直递增吗?
  • 我现在明白了(我想)。我最初想的是一个带有单独数据库的隔离mutlitenant architecture。我现在了解到您使用的是共享模型。
【解决方案2】:

如果您需要生成的 ID 数量很少(几百个),您可以使用 SELECT MAX(student_id)+1 FROM Student WHERE tenant_id = :tenant。如果您使用学生和租户 ID 添加索引,优化器应该使用它而不是主表,这将有助于将锁定保持在最低限度。

如果您谈论的是数千个 ID,那么您可能需要考虑制作一个分发 ID 值的“ID 服务器”。在启动时,它会使用每个租户的最大值来初始化自己,然后在您向其询问 ID 时返回序列中的下一个值。您可能希望有某种方法使其自行重置(通过重新读取数据库),以防您因事务中止或其他原因而“浪费”了一个 ID。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-16
    • 2012-12-14
    • 1970-01-01
    • 2019-05-18
    • 1970-01-01
    • 1970-01-01
    • 2012-07-06
    • 2023-04-01
    相关资源
    最近更新 更多