Je datamodel lijkt niet zo logisch. Je hebt drie verschillende entiteiten admin
, user
, en login
. Ze lijken alle drie dezelfde informatie op te slaan:een e-mailadres, een gebruikersnaam en een wachtwoord (waarvan ik hoop dat de basisbeveiliging in werkelijkheid een wachtwoord-hash is). Als er relaties zijn tussen de tabellen, schendt dat de basisnormalisatie omdat je dezelfde informatie op meerdere plaatsen zou opslaan.
Als u de zakelijke vereisten niet kent voor de entiteiten die u daadwerkelijk probeert te modelleren, is het moeilijk om precies te weten wat u wilt.
Mijn eerste gok is dat je twee soorten gebruikers hebt, beheerders en gewone gebruikers, die elk kunnen inloggen op je applicatie. Ervan uitgaande dat de kenmerken van gebruikers redelijk consistent zijn, ongeacht hun rol (zowel beheerders als gewone gebruikers hebben e-mailadressen, wachtwoorden, enz.), is de eenvoudigste manier om dat te modelleren met een enkele login
tabel met een login_type
die u vertelt of een bepaalde gebruiker een beheerder of een gewone gebruiker is
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') )
);
U kunt dat wat flexibeler maken door een opzoektabel te maken voor de inlogtypen die uw login
tabelreferenties
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 )
);
Als u meer flexibiliteit wilt, zou de volgende stap zijn om te zeggen dat logins niet echt een type hebben. In plaats daarvan hebben ze een of meer rollen met een aantal machtigingen. Je hebt misschien een admin
rol en een regular user
rol aanvankelijk maar wil later een read only user
. toevoegen rol, een superuser
rol, enz. In dat geval zou je zoiets hebben als
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 )
);