sql >> Databáze >  >> RDS >> Oracle

dva cizí klíče na stejný číselný datový typ a odkazují na dvě tabulky

Zdá se, že váš datový model nedává moc smysl. Máte tři různé entity admin , user a login . Zdá se, že všechny tři ukládají stejné informace - e-mailovou adresu, uživatelské jméno a heslo (což doufám pro základní zabezpečení je skutečně hash hesla). Pokud mezi tabulkami existují nějaké vztahy, porušuje to základní normalizaci, protože byste ukládali stejné informace na více místech.

Pokud neznáte obchodní požadavky na entity, které se ve skutečnosti snažíte modelovat, je těžké přesně vědět, co chcete.

Můj první odhad je, že máte dva typy uživatelů, administrátory a běžné uživatele, z nichž každý se může přihlásit do vaší aplikace. Za předpokladu, že atributy uživatelů jsou docela konzistentní bez ohledu na jejich roli (administrátoři i běžní uživatelé mají e-mailové adresy, hesla atd.), nejjednodušší způsob modelování by byl pomocí jediného login tabulka s login_type který vám řekne, zda je konkrétní uživatel správcem nebo běžným uživatelem

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

Můžete to udělat trochu flexibilnější vytvořením vyhledávací tabulky pro typy přihlášení, ke kterým se login odkazy na tabulky

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

Pokud chcete větší flexibilitu, dalším krokem by bylo říci, že přihlášení ve skutečnosti nemají typ. Místo toho mají jednu nebo více rolí, které mají určitou sadu oprávnění. Možná máte admin role a regular user role zpočátku, ale později chcete přidat read only user role, superuser role atd. V takovém případě byste měli něco jako

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. Regulární výraz pro vrácení čísla po odpovídajícím řetězci v oracle

  2. Jak mohu upravit jednu hodnotu vlastnosti uvnitř datového typu PostgreSQL JSONB?

  3. Chyba 'Nenalezen žádný vhodný ovladač' pro použití databáze ve webové službě na serveru Glassfish

  4. Jak získat nový běžecký zůstatek ze stávajícího zůstatku?