PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Fremdschlüssel für eine Eins-zu-Alle-Beziehung

Ich gehe davon aus, dass Verweise auf den customer Tabelle und customer_id beginnend mit der Definition Ihrer users Tabelle bedeutet wirklich, sich auf tenant zu beziehen und tenant_id .

Irgendwann müssen Sie darauf vertrauen, dass Ihr Code korrekt ist. Wenn Ihnen das nicht ausreicht und Sie Einschränkungen haben müssen, dann würde ich Folgendes tun:


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)
);

Andernfalls stecken Sie beim Duplizieren von tenant_id fest in user_roles .