我知道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有效。
在我的开发和测试环境中,以及我的测试用例通过等情况下,这似乎都可以正常工作。但是我仍然对设计不满意。
我的问题:
如果使用DROP SCHEMA -schema- CASCADE删除了tenant_schema(当有人取消其订阅并删除其帐户时,我会这样做),Postgres会知道会自动删除public.workspaces下的关联记录吗? / p>
如何将工作空间重新绑定到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)
)