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