【发布时间】:2017-07-07 10:07:15
【问题描述】:
假设我有一个用户表,其中用户是特定租户的成员,并且他们的电子邮件被唯一地索引到他们的租户,如下所示:
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,但我们可能还会添加一个 global 布尔值。
有没有办法为这个逻辑编写约束?您不能简单地使电子邮件全局唯一地受到约束,因为它们将无法在租户之间重复,并且如果您使用空租户 ID 进行索引,如果存在具有相同 e 的租户用户,postgres 将允许未租户用户- 邮件。
我查看了排除约束和检查,但不知道如何组合它们(如果tenant_id 为空,则全局唯一地约束电子邮件,并在插入任何记录时检查具有空租户 ID 和匹配电子邮件的记录记录)。
请不要问我为什么要这样做——我的表实际上不是用户,我们已经考虑并驳回了其他架构:)
提前致谢!
【问题讨论】:
-
为什么不是(电子邮件、租户)的唯一索引?
-
正如我所说的“他们的电子邮件被唯一地索引到他们的租户”——我们已经涵盖了第一部分,这很容易。问题是关于第二部分的。
标签: postgresql unique-constraint postgresql-9.4 rails-postgresql unique-index