Sql 同一数值数据类型的两个外键,并将其引用到两个表

Sql 同一数值数据类型的两个外键,并将其引用到两个表,sql,oracle,Sql,Oracle,可以在一个表中为同一类型的数字数据创建两个外键,并将其引用到两个表中,下面是我的示例 创建表管理员和主键 /* table admin*/ create table admin (id_admin number(10) not null, email_admin varchar(30) not null, password_admin varchar(10) not null); /* primary key *

可以在一个表中为同一类型的数字数据创建两个外键,并将其引用到两个表中,下面是我的示例

创建表管理员和主键

/* table admin*/
create table admin (id_admin number(10) not null, 
                    email_admin varchar(30) not null, 
                    password_admin varchar(10) not null);
/* primary key */
alter table admin add constraint admin_pk primary key (id_admin);
/* table user*/
create table user (id_user number(10) not null, 
                   email_user varchar(30) not null, 
                   password_user varchar(10) not null);
/* primary key */
alter table user add constraint user_pk primary key (id_user);
创建表用户和主键

/* table admin*/
create table admin (id_admin number(10) not null, 
                    email_admin varchar(30) not null, 
                    password_admin varchar(10) not null);
/* primary key */
alter table admin add constraint admin_pk primary key (id_admin);
/* table user*/
create table user (id_user number(10) not null, 
                   email_user varchar(30) not null, 
                   password_user varchar(10) not null);
/* primary key */
alter table user add constraint user_pk primary key (id_user);
创建表登录名、主键和外键

/* table login*/
create table login(id_login number(10) not null, 
                   id_admin_user_login number(10) not null, 
                   email_login varchar(20) not null, 
                   password_login varchar(10) not null);
/* primary key */
alter table login add constraint login_pk primary key (id_login);

/* foreign key reference to admin*/
alter table login add constraint login_fk_admin foreign key (id_admin_user_login) 
reference admin(id_admin);

 /* foreign key reference to user*/
alter table login add constraint login_fk_user foreign key (id_admin_user_login) 
reference user(id_user);

有可能吗?

在这种情况下,将FK设置为2个表会破坏目的-一个人必须同时是用户和管理员。管理员或用户实际上是角色,所以您可以有,例如(过于简化的示例,仅用于说明方法。您可以通过搜索party角色关系模型找到更多)


您的数据模型似乎没有多大意义。您有三个不同的实体
管理员
用户
登录
。它们三个似乎都存储相同的信息——电子邮件地址、用户名和密码(我希望基本安全性实际上是密码散列)。如果表之间存在任何关系,则会违反基本规范化,因为您将在多个位置存储相同的信息

由于不知道您实际尝试建模的实体的业务需求,很难准确地知道您想要什么

我的第一个猜测是,您有两种类型的用户,管理员和普通用户,每个用户都可以登录到您的应用程序。假设用户的属性非常一致,无论其角色如何(管理员和普通用户都有电子邮件地址、密码等),最简单的建模方法是使用单个
login
表,该表带有
login\u 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 )
);
如果您想要更大的灵活性,下一步就是说登录没有真正的类型。相反,它们有一个或多个具有某种权限集的角色。最初您可能有一个
管理员
角色和一个
普通用户
角色,但后来您希望添加一个
只读用户
角色、一个
超级用户
角色,等等。在这种情况下,您可能需要

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

你可以让任意多个FK指向一个字段…是的,我理解,但问题是表中的引用,如果我从admin创建login,我有一个错误,login_FK_用户违反了父密钥,所以可能解决方案不是我认为的,但可能是不可能的?然后你需要修复插入。如果要将数据填充到带有FK的表中,则必须确保FK指向的任何表中都有匹配的“父”记录。。。您不能创建孤立记录,这首先会破坏使用FKs的目的。那么,在这种情况下,您支持什么?您有两条
create table user
语句。第二个是在
/*表登录*/
注释下,因此我假设您的意思是
创建表登录
。我不了解该方,但我将搜索该方的角色关系模型,以更好地了解我想要更多建议,以找到更好的解决方案