Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

duas chaves estrangeiras para o mesmo tipo de dados numérico e referenciá-lo a duas tabelas


Seu modelo de dados não parece fazer muito sentido. Você tem três entidades diferentes admin , user e login . Todos os três parecem armazenar as mesmas informações - um endereço de e-mail, um nome de usuário e uma senha (que espero que para segurança básica seja realmente um hash de senha). Se houver algum relacionamento entre as tabelas, isso viola a normalização básica porque você armazenaria as mesmas informações em vários locais.

Sem conhecer os requisitos de negócios para as entidades que você está realmente tentando modelar, é difícil saber exatamente o que você deseja.

Meu primeiro palpite é que você tem dois tipos de usuários, administradores e usuários regulares, cada um dos quais pode fazer login em seu aplicativo. Supondo que os atributos dos usuários sejam bastante consistentes, independentemente de sua função (administradores e usuários regulares têm endereços de e-mail, senhas, etc.), a maneira mais simples de modelar isso seria com um único login tabela com um login_type que informa se um determinado usuário é um administrador ou um usuário comum
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') )
);

Você pode tornar isso um pouco mais flexível criando uma tabela de pesquisa para os tipos de login que seu login referências de tabela
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 )
);

Se você quiser mais flexibilidade, o próximo passo seria dizer que os logins não têm realmente um tipo. Em vez disso, eles têm uma ou mais funções que possuem algum conjunto de permissões. Você pode ter um admin função e um regular user função inicialmente, mas depois deseja adicionar um read only user função, um superuser papel, etc. Nesse caso, você teria algo como
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 )
);