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