sql >> Base de Datos >  >> RDS >> Oracle

dos claves foráneas al mismo tipo de datos numéricos y hacer referencia a dos tablas

Su modelo de datos no parece tener mucho sentido. Tienes tres entidades diferentes admin , user y login . Los tres parecen almacenar la misma información:una dirección de correo electrónico, un nombre de usuario y una contraseña (que espero que por seguridad básica sea realmente un hash de contraseña). Si hay alguna relación entre las tablas, eso viola la normalización básica porque estaría almacenando la misma información en varios lugares.

Sin conocer los requisitos comerciales de las entidades que realmente está tratando de modelar, es difícil saber con precisión lo que desea.

Mi primera suposición es que tiene dos tipos de usuarios, administradores y usuarios regulares, cada uno de los cuales puede iniciar sesión en su aplicación. Asumiendo que los atributos de los usuarios son bastante consistentes independientemente de su función (tanto los administradores como los usuarios normales tienen direcciones de correo electrónico, contraseñas, etc.), la forma más sencilla de modelar eso sería con un solo login tabla con un login_type que le dice si un usuario en particular es un administrador o un usuario normal

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

Puede hacerlo un poco más flexible creando una tabla de búsqueda para los tipos de inicio de sesión que su login referencias de tablas

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 desea más flexibilidad, el siguiente paso sería decir que los inicios de sesión realmente no tienen un tipo. En su lugar, tienen uno o más roles que tienen algún conjunto de permisos. Es posible que tenga un admin rol y un regular user rol inicialmente pero luego desea agregar un read only user rol, un superuser rol, etc. En ese caso, tendría 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 )
);