如何解决一对一关系的外键
我想构建一个具有全局角色和自定义角色的多租户解决方案。
应用程序的授权将基于权限构建。
然后可能会定义一个结合了多个权限的角色。
我想提供几个可以供所有人使用的预定义全局角色。
此外,我想为租户提供定义其自定义角色的功能。
此刻,我有以下方案设计草案(postgres):
create table tenants (
id uuid primary key,...
);
create table permissions (
code character varying(30) primary key
);
create table roles (
id uuid primary key,tenant_id uuid null references tenants,...
);
create unique index on roles (id,tenant_id) where tenant_id is not null;
create table role_permissions (
role_id uuid not null references roles,permission_id character varying(30) not null references permissions,unique (role_id,permission_id)
);
create table users (
id uuid not null,tenant_id uuid not null references tenants,...
primary key (id,tenant_id)
);
create table user_roles (
tenant_id uuid not null,user_id uuid not null,role_tenant_id uuid null,role_id uuid not null references roles,foreign key (user_id,tenant_id) references users (id,tenant_id),check (customer_id = role_tenant_id or role_tenant_id is null)
);
在这种模式下,我无法正确引用user_roles中的角色。
是否可以在postgres中实现这种约束?
解决方法
我假设从您的customer
表的定义开始对customer_id
表和users
的引用实际上意味着要引用tenant
和tenant_id
。
在某些时候,您需要相信自己的代码是正确的。如果那对您来说还不够好,并且您必须有约束条件,那么我会这样做:
create or replace function user_role_check(_user_id uuid,_role_id uuid)
returns boolean as $$
select count(*) = 1
from roles r
join users u
on u.tenant_id = r.tenant_id
where u.id = _user_id
and r.id = _role_id;
$$ language sql;
create table user_roles (
id uuid not null primary key,user_id uuid references users(id),role_id uuid references roles(id),check (user_role_check(user_id,role_id)),unique (user_id,role_id)
);
否则,您将无法将tenant_id
复制到user_roles
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。