PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Klucz obcy do relacji jeden do wszystkich

Zakładam, że odniesienia do customer tabela i customer_id zaczynając od definicji Twoich users tabela naprawdę oznacza odniesienie do tenant i tenant_id .

W pewnym momencie musisz zaufać swojemu kodowi, aby był poprawny. Jeśli to nie jest dla ciebie wystarczająco dobre, a musisz mieć ograniczenia, to zrobię tak:


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

W przeciwnym razie utkniesz przy duplikowaniu tenant_id na user_roles .




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Uaktualnić kolumnę PostgreSQL JSON do JSONB?

  2. Operacje bitowe w Postgres

  3. Wyzwalacz pożaru przy aktualizacji kolumny A, kolumny B lub kolumny C

  4. UWAGI do sekwencji po uruchomieniu migracji w kolejkach w aplikacji postgresql

  5. Wady tabeli ze zbyt dużą liczbą kolumn