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

to fremmednøgler til den samme numeriske datatype og referer det til to tabeller

Din datamodel ser ikke ud til at give særlig mening. Du har tre forskellige enheder admin , user , og login . Alle tre ser ud til at gemme de samme oplysninger - en e-mail-adresse, et brugernavn og en adgangskode (hvilket jeg håber for grundlæggende sikkerhed er virkelig en adgangskode-hash). Hvis der er nogen relationer mellem tabellerne, overtræder det grundlæggende normalisering, fordi du ville gemme den samme information flere steder.

Uden at kende forretningskravene til de enheder, du rent faktisk prøver at modellere, er det svært at vide præcist, hvad du vil have.

Mit første gæt er, at du har to typer brugere, administratorer og almindelige brugere, som hver kan logge ind på din applikation. Hvis man antager, at brugernes egenskaber er ret konsistente uanset deres rolle (både administratorer og almindelige brugere har e-mailadresser, adgangskoder osv.), er den enkleste måde at modellere på med et enkelt login tabel med en login_type der fortæller dig, om en bestemt bruger er en admin eller en almindelig bruger

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øre det lidt mere fleksibelt ved at oprette en opslagstabel for de logintyper, som dit login tabelreferencer

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

Hvis du ønsker mere fleksibilitet, vil det næste skridt være at sige, at logins ikke rigtig har en type. I stedet har de en eller flere roller, der har et sæt tilladelser. Du har muligvis en admin rolle og en regular user rolle i starten, men senere ønsker at tilføje en read only user rolle, en superuser rolle osv. I så fald ville du have noget lignende

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. MariaDB JSON_CONTAINS_PATH() Forklaret

  2. SQL Server:To-niveau GROUP BY med XML-output

  3. Udfladning af Postgres indlejret JSONB-kolonne

  4. Få de nærmeste poster til en bestemt dato grupperet efter type