Oracle
 sql >> Baza danych >  >> RDS >> Oracle

dwa klucze obce do tego samego liczbowego typu danych i odwołują się do dwóch tabel

Twój model danych wydaje się nie mieć sensu. Masz trzy różne podmioty admin , user i login . Wszystkie trzy zdają się przechowywać te same informacje – adres e-mail, nazwę użytkownika i hasło (mam nadzieję, że podstawowe bezpieczeństwo jest tak naprawdę hashem hasła). Jeśli istnieją jakiekolwiek relacje między tabelami, narusza to podstawową normalizację, ponieważ te same informacje byłyby przechowywane w wielu miejscach.

Nie znając wymagań biznesowych dla podmiotów, które faktycznie próbujesz modelować, trudno jest dokładnie określić, czego chcesz.

Moje pierwsze przypuszczenie jest takie, że masz dwa typy użytkowników, administratorów i zwykłych użytkowników, z których każdy może zalogować się do Twojej aplikacji. Zakładając, że atrybuty użytkowników są dość spójne, niezależnie od ich roli (zarówno administratorzy, jak i zwykli użytkownicy mają adresy e-mail, hasła itp.), najprostszy sposób modelowania, który byłby za pomocą jednego login tabela z login_type który informuje, czy dany użytkownik jest administratorem czy zwykłym użytkownikiem

create table login (
  login_id      integer primary key,
  email         varchar2(255),
  password_hash raw(32),
  login_type    varchar2(1) check( login_type IN ('A', 'U') )
);

Możesz uczynić to nieco bardziej elastycznym, tworząc tabelę przeglądową dla typów logowania, które Twój login odniesienia do tabeli

create table login_type_lkup (
  login_type_code varchar2(1) primary key,
  login_type_desc varchar2(255)
);

create table login (
  login_id        integer primary key,
  email           varchar2(255),
  password_hash   raw(32),
  login_type_code varchar2(1) references login_type_lkup( login_type_code )
);

Jeśli potrzebujesz większej elastyczności, następnym krokiem byłoby stwierdzenie, że loginy tak naprawdę nie mają typu. Zamiast tego mają co najmniej jedną rolę z pewnym zestawem uprawnień. Możesz mieć admin rolę i regular user początkowo, ale później chcesz dodać read only user rola, superuser rola itp. W takim przypadku masz coś w rodzaju

create table login (
  login_id        integer primary key,
  email           varchar2(255),
  password_hash   raw(32)
);

create table role (
  role_id integer primary key,
  role_desc varchar2(255)
);

create table permission (
  permission_id integer primary key,
  permission_desc varchar2(255)
);

create table login_role (
  login_id integer references login(login_id), 
  role_id  integer references role(role_id),
  primary key pk_login_role( login_id, role_id )
);

create table role_permission (
  role_id       integer references role(role_id),
  permission_id integer references permission(permission_id),
  primary key pk_role_permission( role_id, permission_id )
);


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Wielkie litery w nazwach dni i miesięcy podczas formatowania dat w Oracle

  2. Pobieranie danych wyjściowych RefCursor i VarChar z tej samej procedury przechowywanej

  3. Kolejność oceny klauzuli Oracle SQL

  4. Podziel duży plik tekstowy/CSV na wiele plików w PL SQL

  5. ORACLE - regexp_substr zwraca wartości null