插入具有多个值的外键

typ*_*ef1 4 database oracle

我想知道,有没有可能创建一个表,我有一个表接受外键但可能有同一行的多个值.

例如:

Employee(id,name,skillid);
Skill(Skillid,skillname);
Run Code Online (Sandbox Code Playgroud)

这里是Employee的一个实例

Employee(311,"john", (01,02) );
Skill (01,Java); Skill (02,C++);
Run Code Online (Sandbox Code Playgroud)

我为表格实现了相同的制作主键(是,skillid)

但在一个案例中我有一张桌子:

create table Movie (Movie_ID varchar(5),                              
                            Cast varchar(5),
                            foreign key(Cast) references Person(Person_ID), 
                            primary key(movie_id, Cast));
Run Code Online (Sandbox Code Playgroud)

和另一张表:

create table Awards  (Award_Id varchar(5),
                                Person_Id varchar(5), 
                                Movie_Id varchar(5),
                                Award_Name  varchar(30),
                                Year number(4),
                                Organization_Id varchar(5),
                                primary key (Award_id,year,Organization_Id),
                                foreign key(Person_Id) references Person(Person_ID),
--                                foreign key(Movie_ID) references Movie(Movie_ID),
                                foreign key(Organization_Id) references Organization(Organization_Id));
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我无法使用Movie_ID作为外键,因为它引用的表具有2个东西的组合作为其主键.我没有在奖项表中使用其中第二个属性.

有何提示如何实施?

Ben*_*Ben 6

不幸的是,你刚刚问过这个古老的问题;

如何在一列中放两件东西?

答案是,当然,你没有; 你有两列.要扩展您的员工示例,您的员工表将变为:

create table employees (
   id number
 , name varchar2(4000)
 , skill_1 number
 , skill_2 number
 , constraint employee_pk primary key (id)
 , constraint employee_skill_1_fs 
      foreign key ( skill_1 ) 
   references skills(skillid)
 , constraint employee_skill_2_fs 
      foreign key ( skill_2 ) 
   references skills(skillid) 
   );
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,这不是一件特别漂亮的事情,并打破了规范化; 如果您希望您的员工(或您的员工当然想要)拥有3项技能,会发生什么?还是10?

创建第三个表并通过单个主键和外键完成所有连接可能会更好; 所以你会的

employees ( employee_id, ..., pk employee_id);
employee_skills ( employee_id, skill_id, ..., pk employee_id, skill_id, fk skill_id );
skills ( skill_id, description, ..., pk skill_id );
Run Code Online (Sandbox Code Playgroud)