Oracle
 sql >> Database >  >> RDS >> Oracle

due chiavi esterne allo stesso tipo di dati numerici e fare riferimento a due tabelle

Il tuo modello di dati non sembra avere molto senso. Hai tre diverse entità admin , user e login . Tutti e tre sembrano memorizzare le stesse informazioni:un indirizzo e-mail, un nome utente e una password (che spero per la sicurezza di base sia davvero un hash della password). Se ci sono relazioni tra le tabelle, ciò viola la normalizzazione di base perché memorizzeresti le stesse informazioni in più posizioni.

Non conoscendo i requisiti aziendali per le entità che stai effettivamente cercando di modellare, è difficile sapere esattamente cosa vuoi.

La mia prima ipotesi è che tu abbia due tipi di utenti, amministratori e utenti regolari, ognuno dei quali può accedere alla tua applicazione. Supponendo che gli attributi degli utenti siano abbastanza coerenti indipendentemente dal loro ruolo (sia gli amministratori che gli utenti regolari hanno indirizzi e-mail, password, ecc.), il modo più semplice per modellarlo sarebbe con un singolo login tabella con un login_type che ti dice se un particolare utente è un amministratore o un utente normale

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

Puoi renderlo un po' più flessibile creando una tabella di ricerca per i tipi di accesso che il tuo login riferimenti alle tabelle

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

Se desideri una maggiore flessibilità, il passaggio successivo sarebbe dire che gli accessi non hanno davvero un tipo. Al contrario, hanno uno o più ruoli che dispongono di una serie di autorizzazioni. Potresti avere un admin role e un regular user ruolo inizialmente, ma in seguito desidera aggiungere un read only user ruolo, un superuser ruolo, ecc. In tal caso, avresti qualcosa come

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