Oracle
 sql >> Base de données >  >> RDS >> Oracle

deux clés étrangères au même type de données numériques et le référencer à deux tables

Votre modèle de données ne semble pas avoir beaucoup de sens. Vous avez trois entités différentes admin , user , et login . Tous les trois semblent stocker les mêmes informations - une adresse e-mail, un nom d'utilisateur et un mot de passe (qui, j'espère pour la sécurité de base, est vraiment un hachage de mot de passe). S'il existe des relations entre les tables, cela enfreint la normalisation de base car vous stockeriez les mêmes informations à plusieurs endroits.

Ne connaissant pas les exigences commerciales des entités que vous essayez réellement de modéliser, il est difficile de savoir précisément ce que vous voulez.

Ma première supposition est que vous avez deux types d'utilisateurs, les administrateurs et les utilisateurs réguliers, chacun pouvant se connecter à votre application. En supposant que les attributs des utilisateurs sont assez cohérents quel que soit leur rôle (les administrateurs et les utilisateurs réguliers ont des adresses e-mail, des mots de passe, etc.), la façon la plus simple de modéliser cela serait avec un seul login table avec un login_type qui vous indique si un utilisateur particulier est un administrateur ou un utilisateur régulier

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

Vous pouvez rendre cela un peu plus flexible en créant une table de recherche pour les types de connexion que votre login références de table

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

Si vous voulez plus de flexibilité, la prochaine étape serait de dire que les connexions n'ont pas vraiment de type. Au lieu de cela, ils ont un ou plusieurs rôles qui ont un ensemble d'autorisations. Vous avez peut-être un admin rôle et un regular user rôle initialement, mais plus tard, vous souhaitez ajouter un read only user rôle, un superuser rôle, etc. Dans ce cas, vous auriez quelque chose comme

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