根据“动态”架构名称定义外键

时间:2019-05-28 19:43:48

标签: postgresql database-design

我知道Postgres allows you to define foreign keys across schemas

我在多租户应用程序中利用了这一点,在该应用程序中,每个租户都有自己的架构。除了自己的表外,租户还“拥有”公共架构中的一些记录,因此我可以这样做:

ALTER TABLE tenant_schema.some_table ADD (
  CONSTRAINT workspace_fk
    FOREIGN KEY (workspace_id)
    REFERENCES public.workspaces(id)
)

public.workspaces表如下所示:

|--------------------|    |---------------------------|
|  public.workspaces |    | tenant_1642.organizations |
|--------------------|    |---------------------------|
|         id         |    |          id               |
|        name        |    |       workspace_id        |
|     schema_name    |    |        org_name           |
|      subdomain     |    |         address           |
|--------------------|    |---------------------------|

我使用这种设计将Web请求路由到基于子域的适当架构。例如,如果有人向https://org1.fancyapp.com/resource/id发出请求,我可以在“ {public.workspaces”下的org1上进行查找,然后知道将该请求路由到“ schema_org1.sessions”以查看他们的会话Cookie有效。

在我的开发和测试环境中,以及我的测试用例通过等情况下,这似乎都可以正常工作。但是我仍然对设计不满意。

我的问题:

  1. 如果使用DROP SCHEMA -schema- CASCADE删除了tenant_schema(当有人取消其订阅并删除其帐户时,我会这样做),Postgres会知道会自动删除public.workspaces下的关联记录吗? / p>

  2. 如何将工作空间重新绑定到tenant_schema.organizations下的记录?换句话说,如何将外键(例如organization_id)添加到public.workspaces,以便根据schema_name列下的值动态地定义关系?

在定义外键关系时,是否有一种方法可以动态插值列的值?例如

ALTER TABLE public.workspaces ADD (
  CONSTRAINT organization_fk
    FOREIGN KEY (organization_id)
    REFERENCES ${public.workspaces.schema_name_col_value}.organizations(id)
)
  1. 在数据库设计方面,是否有其他方法可以处理这种类型的要求(即允许给定的电子邮件地址注册多个帐户,每个帐户在一个唯一的约束下(例如Slack)都具有自己的子域?

0 个答案:

没有答案