sql >> Database >  >> RDS >> Oracle

twee externe sleutels naar hetzelfde numerieke gegevenstype en verwijs ernaar naar twee tabellen

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


  1. Match en Against gebruiken in MySQL en CodeIgniter

  2. BCP - Ongeldige tekenwaarde voor cast-specificatie bij importeren naar tabel met IDENTITY-kolom

  3. MySQL #1364 - Veld 'column_name' heeft geen standaardwaarde - kan niet in DB worden ingevoegd

  4. nvarchar aaneenschakeling / index / nvarchar (max) onverklaarbaar gedrag