sql >> Databasteknik >  >> RDS >> Oracle

två främmande nycklar till samma numeriska datatyp och referera till två tabeller

Din datamodell verkar inte vara särskilt vettig. Du har tre olika enheter admin , user och login . Alla tre av dem verkar lagra samma information - en e-postadress, ett användarnamn och ett lösenord (som jag hoppas för grundläggande säkerhet är verkligen en lösenords-hash). Om det finns några relationer mellan tabellerna bryter det mot grundläggande normalisering eftersom du skulle lagra samma information på flera ställen.

Om du inte känner till affärskraven för de enheter du faktiskt försöker modellera, är det svårt att veta exakt vad du vill ha.

Min första gissning är att du har två typer av användare, admins och vanliga användare, som var och en kan logga in på din applikation. Om man antar att användarnas attribut är ganska konsekventa oavsett roll (både administratörer och vanliga användare har e-postadresser, lösenord etc.) är det enklaste sättet att modellera med en enda login tabell med en login_type som talar om för dig om en viss användare är en administratör eller en vanlig användare

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

Du kan göra det lite mer flexibelt genom att skapa en uppslagstabell för de inloggningstyper som din login tabellreferenser

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

Om du vill ha mer flexibilitet skulle nästa steg vara att säga att inloggningar egentligen inte har en typ. Istället har de en eller flera roller som har en uppsättning behörigheter. Du kanske har en admin roll och en regular user roll initialt men senare vill lägga till en read only user roll, en superuser roll, etc. I så fall skulle du ha något liknande

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. Hur man ändrar tabell lägg till kolumn oracle

  2. Ladda data i MySQL-fil med absolut URL

  3. Jag får hela tiden den här mysql-felkoden #1089

  4. Undertrycker PDO-varningar