Oracle
 sql >> база данни >  >> RDS >> Oracle

два външни ключа към един и същи числов тип данни и го препраща към две таблици

Вашият модел на данни изглежда няма много смисъл. Имате три различни обекта admin , user и login . Изглежда, че и трите съхраняват една и съща информация - имейл адрес, потребителско име и парола (която се надявам за основна сигурност наистина да е хеш на парола). Ако има някакви връзки между таблиците, това нарушава основната нормализация, защото ще съхранявате една и съща информация на множество места.

Без да знаете бизнес изискванията за обектите, които всъщност се опитвате да моделирате, е трудно да знаете какво точно искате.

Първото ми предположение е, че имате два типа потребители, администратори и редовни потребители, всеки от които може да влезе в приложението ви. Ако приемем, че атрибутите на потребителите са доста последователни, независимо от тяхната роля (както администраторите, така и обикновените потребители имат имейл адреси, пароли и т.н.), най-простият начин за моделиране би бил с едно login таблица с login_type който ви казва дали даден потребител е администратор или обикновен потребител

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

Можете да направите това малко по-гъвкаво, като създадете справочна таблица за типовете влизане, които вашето login препратки към таблици

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

Ако искате повече гъвкавост, следващата стъпка би била да кажете, че влизанията всъщност нямат тип. Вместо това те имат една или повече роли, които имат някакъв набор от разрешения. Може да имате admin роля и regular user роля първоначално, но по-късно искате да добавите read only user роля, superuser роля и т.н. В такъв случай ще имате нещо като

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Драйверът за управляван Oracle ODP.NET използва ли мрежово криптиране?

  2. .Net - Създаване на набор от записи при поискване вместо изтегляне на всичко в паметта наведнъж

  3. Изтриване на записи от една таблица, свързани към друга таблица SQL

  4. SQL:Как да намеря дубликати въз основа на две полета?

  5. Обединяване на последователни интервали на валидност на датата