假设我有一个用户表,其中用户是特定租户的成员,并且他们的电子邮件已经按照租户进行了唯一索引,如下所示:
我们已经通过唯一索引实现了这一点,这部分很容易。
现在假设我想要添加一个全局用户,该用户可以访问所有租户,但仅当电子邮件在表中根本不存在时才能访问。此外,一旦记录存在,无论是租户还是非租户,都将无法使用相同的电子邮件。
为了明确起见,全局用户可以简单地具有空租户ID,但我们可能还会添加一个“全局”布尔值。
有没有办法为这个逻辑编写约束?您不能简单地使电子邮件具有全局独特性,因为它们将无法在不同租户之间重复使用。如果您使用空租户ID进行索引,则Postgres将允许未被租用的用户,如果有相同电子邮件的租用用户。
我查看了排除约束和检查,但无法弄清如何将它们组合(如果tenant_id为空,则唯一限制电子邮件;并在插入任何记录时检查具有空租户ID和匹配电子邮件的记录)。
请不要问我为什么要以这种方式处理事情--我的表实际上不是用户,并且我们已经考虑过并放弃了其他架构 :)
提前致谢!
User
id | tenant_id | email
1 1 person1@example.com
2 1 person2@example.com
该用户被允许访问,因为尽管使用了相同的电子邮件地址,但他们所属的租户不同:
3 2 person1@example.com
由于相同租户下已存在重复的电子邮件,此用户被禁止:
4 2 person1@example.com <--- will throw an error
我们已经通过唯一索引实现了这一点,这部分很容易。
现在假设我想要添加一个全局用户,该用户可以访问所有租户,但仅当电子邮件在表中根本不存在时才能访问。此外,一旦记录存在,无论是租户还是非租户,都将无法使用相同的电子邮件。
为了明确起见,全局用户可以简单地具有空租户ID,但我们可能还会添加一个“全局”布尔值。
有没有办法为这个逻辑编写约束?您不能简单地使电子邮件具有全局独特性,因为它们将无法在不同租户之间重复使用。如果您使用空租户ID进行索引,则Postgres将允许未被租用的用户,如果有相同电子邮件的租用用户。
我查看了排除约束和检查,但无法弄清如何将它们组合(如果tenant_id为空,则唯一限制电子邮件;并在插入任何记录时检查具有空租户ID和匹配电子邮件的记录)。
请不要问我为什么要以这种方式处理事情--我的表实际上不是用户,并且我们已经考虑过并放弃了其他架构 :)
提前致谢!